tl; dr
- Memorizza le date e le ore in UTC per comparabilità, cernita, facile conversione.
- Memorizza anche il fuso orario IANA come attributo dell'evento se devi definire che cosa tz utilizzare per la visualizzazione indipendentemente dalla posizione corrente dell'utente.
Altri dettagli
Secondo la mia esperienza, il modello più raccomandato e utilizzato è quello di memorizzare date e ore nel fuso orario di Etc / UTC ( Fusi orari IANA ) e per visualizzare le date e le ore nell'ora locale dell'utente che visualizza le informazioni. Ciò rende le date e le ore facilmente confrontabili e ordinabili sul lato server e facilmente convertibili in ora locale per la visualizzazione.
Se il tuo requisito è solo quello di visualizzare le ore e le date locali in un browser o un'applicazione nativa in base alla posizione dell'utente, non è necessario memorizzare il fuso orario per ogni volta. I buoni strumenti dell'interfaccia utente, inclusi i browser, possono convertire i tempi UTC e le epoche (che sono per definizione UTC) in base all'ora locale.
Se hai altri requisiti potresti aver bisogno di memorizzare il fuso orario. È necessario anche memorizzare il fuso orario se ... ad esempio ...
-
Si desidera visualizzare le date e le ore di un evento nell'ora locale in cui si verifica l'evento, indipendentemente da dove si trovi attualmente l'utente che visualizza le informazioni. (Credo che questo fosse il tuo requisito.) Il fuso orario dovrebbe probabilmente essere un attributo dell'evento.
-
Hai sempre bisogno di produrre l'output nell'ora locale di un utente o di un evento dai tuoi server. Esempi: pdf, contenuto di posta elettronica, carta prodotta in base alla pianificazione e non direttamente in risposta alla richiesta di un utente. In questo caso, il fuso orario potrebbe essere una preferenza utente o un attributo evento.
Se vuoi memorizzare il fuso orario, dovresti generalmente utilizzare i fusi orari IANA come Etc / UTC e America / Los_Angeles. Sono il più ampiamente supportato da strumenti di sviluppo, librerie temporali, ecc. Sono convertibili in fusi orari Windows ( vedi questa domanda )
Non abbastanza dettagli? - Perché gli offset sono diversi dai fusi orari?
La memorizzazione di un offset UTC come -08: 00 non equivale alla memorizzazione di un fuso orario. Un offset UTC è valido per archiviare, recuperare e visualizzare un orario specifico, ad esempio 2017-09-09T12: 00: 00-08: 00. Ti consente di visualizzare quell'ora locale in qualsiasi momento nel futuro e di convertirla in UTC.
A seconda degli strumenti utilizzati, la memorizzazione di uno scarto potrebbe non soddisfare le tue esigenze. Ad esempio:
- L'offset da solo non indica il fuso orario in cui si trova l'evento.
- Se hai bisogno di registrare o programmare un altro evento in una data diversa nella stessa posizione, non puoi semplicemente supporre che l'offset dell'ultimo evento sia riutilizzabile.
- L'offset -08: 00 può essere America / Los_Angeles o America / Anchorage o America / Tijuana, ad esempio. Messico e USA avviano l'ora legale in diverse date dal 2007. Quindi è necessario un fuso orario per sapere quale offset utilizzare in una nuova data.
- Non è possibile determinare il fuso orario di un evento in modo affidabile dall'offset UTC del browser dell'utente o del sistema operativo locale.
- Anche se ottieni il fuso orario dell'utente da uno dei browser che lo supporta o dal sistema operativo locale, l'utente si trova su una spiaggia in Messico mentre pianifica un evento a Los Angeles?
- Quindi, quando registri un evento, come fai a sapere quale offset utilizzare?
- Avrai mai bisogno di presentare il fuso orario agli utenti? Dirai: "Vieni alla nostra grande battaglia con i robot a San Diego o guardalo dal vivo su botwars.net alle 20:00 UTC -07: 00!"
Le tue esigenze potrebbero dettare la necessità di conoscere il fuso orario di un evento rispetto all'offset di qualsiasi momento associato all'evento. Ciò ti consente molta più flessibilità in ciò che puoi fare dopo. È sempre possibile ricreare offset da un fuso orario utilizzando una buona libreria del tempo. Non puoi sempre dedurre in modo affidabile il fuso orario da un offset.
Dovresti implementare tutto questo da solo? No. Ci sono molti buoni strumenti per aiutarti. Assicurati di leggere i limiti dei tipi di orario del database e altri strumenti prima di utilizzarli. Ci sono stati un sorprendente numero di problemi con il supporto di linguaggio e dbms per il tempo, e fortunatamente un bel po 'di librerie di data / ora che riprendono il gioco.