2009-02-05 12 views
29

Ho letto questo argomento nelle ultime ore e penso di avere una soluzione, ma vorrei una conferma.Il modo migliore per gestire la memorizzazione/visualizzazione di date in fusi orari diversi in PHP?

Situazione

Voglio un utente, per esempio, in California per poter inserire un commento che verrà memorizzato in MySQL. Poi voglio che un utente, per esempio, in Texas, sia in grado di visualizzare il commento con la data del post adattata al suo fuso orario.

Soluzione proposta

Memorizzazione

  1. Eseguire il seguente all'inizio del l'applicazione in modo che tutte le funzioni di data utilizzano UTC fuso orario: date_default_timezone_set('UTC');
  2. $Date = new DateTime(); per ottenere un oggetto DateTime con la data e l'ora correnti in UTC.
  3. Utilizzare $Date->format() per ottenere il valore da inserire nella colonna di tipo datetime in MySQL.

Visualizzazione

  1. ottenere informazioni fuso orario dell'utente da JavaScript e conservarla in un cookie.
  2. Eseguire una query MySQL SELECT per recuperare il valore della colonna datetime.
  3. $Date = new DateTime($row['time']); per creare un'istanza di un oggetto DateTime con l'ora UTC memorizzata.
  4. $Date->setTimezone(new DateTimeZone($userTimezone)); per regolare l'ora UTC al fuso orario dell'utente.
  5. display utilizzando $Date->format();

E 'questo il senso di ciò che deve essere fatto? Mi manca una soluzione migliore? Grazie per l'aiuto!

risposta

14

Può essere reso ancora più semplice. Poiché stai utilizzando JavaScript, perché non utilizzare JavaScript per regolare anche il fuso orario sul client?

  1. Conservare tutti i tempi sul server come UTC
  2. servirli al client come UTC
  3. client utilizza JavaScript regolare il tempo di fuso orario locale

Questo non solo rende le cose più semplici, ma supera anche un problema con il tuo modello. Se ho registrato il mio account a New York ma sono in viaggio in Australia, voglio vedere i tempi secondo il fuso orario australiano. Infatti, l'utilizzo di JavaScript che si utilizza può facilmente regolare le impostazioni, rendendo il design ancora più dinamico.In secondo luogo, è possibile evitare il sovraccarico di memorizzazione del fuso orario dell'utente.

Detto questo, se si desidera che il design si degradi su browser non JavaScript, è preferibile adottare un approccio completo lato server basato sui cookie HTTP (anziché fare affidamento su JS per recuperare i cookie).

+0

Penso che imposterò il cookie timezone sul login utente, quindi dovrebbe aggiornarsi se si viaggia in Australia e si effettua il login da lì. Stai suggerendo che alcuni JavaScript funzionino sul caricamento della pagina che cerca volte in, ad esempio, e li converte tutti al volo? –

+0

L'unico modo per arrivare all'orologio utente è tramite JS o geo-ip. Quest'ultimo è complesso e inaffidabile. Se intendi utilizzare JS in ogni caso, eseguirlo al momento dell'accesso richiede più manutenzione (monitoraggio lato server). Facendolo al volo ha più senso qui. – aleemb

+0

Grazie. Mentre lo cerco di più, sto iniziando ad essere d'accordo con te. –

3

Stai facendo tutti i diritti. Memorizza tutte le date in UTC (GMT + 0), recuperale come tale dal database e applica l'offset dell'utente.

In sostanza, hai tutto coperto dall'inizio alla fine, non c'è davvero nulla da aggiungere, non penso che tu possa ottimizzarlo al di là di ciò che stai facendo già.

+0

Sono d'accordo, questo è quello che vorrei fare. – Ross

Problemi correlati