Domanda

Negozio tutto GMT?

Negozio tutto il modo in cui è stata inserita con un embedded offset?

Fare i conti ogni volta che si esegue il rendering?

Visualizza relativi Tempi "1 minuti fa"?

È stato utile?

Soluzione

Per conservare i UTC - se non, il vostro storico di reporting e di comportamento durante le cose come legale va...divertente.GMT è un locale, salvo il legale relativa a UTC (il che non è).

Presentazione per gli utenti dei diversi fusi orari, può essere un vero bastardo se si memorizza ora locale.È facile da regolare per il locale, se i dati non elaborati in formato UTC - basta aggiungere il tuo utente offset e il gioco è fatto!

Joel parlato di questo in uno dei podcast (in una rotonda) - le disse memorizzare i dati in massima risoluzione possibile (ricerca per 'fedeltà'), perché si può sempre munge a quando non si spegne di nuovo.Ecco perché dico che conservare UTC, come l'ora locale è necessario regolare per chi non è in che fuso orario, e che un sacco di duro lavoro.E avete bisogno di memorizzare se, per esempio, l'ora legale era in vigore quando è stato memorizzato il tempo.Yuk.

Spesso nei database, in passato ho memorizzato due - UTC per l'ordinamento, l'ora locale per la visualizzazione.In questo modo né l'utente né il computer confondersi.

Ora, come da visualizzare:Certo, si può fare il "3 minuti fa", ma solo se si memorizzano UTC - in caso contrario, i dati inseriti in diversi fusi orari è di andare a fare le cose come display come "-4 ore fa", che sarà freak persone.Se si sta andando per la visualizzazione del tempo effettivo, la gente ama avere, nel loro tempo, e se i dati immessi in più fusi orari si può fare solo con facilità se si memorizza UTC.

Altri suggerimenti

La risposta, come sempre, è "dipende".

Dipende da ciò che si sta descrivendo, con il tempo, e di come i dati sono stati forniti.La chiave per decidere come memorizzare i valori di tempo è quello di decidere se si stanno perdendo le informazioni da far cadere il fuso orario, così come non sorprende utenti.

Ci sono indubbi vantaggi per l'immagazzinamento dei dati in un UTC time_t - si tratta di una singola int, permettendo una rapida cernita e di facile memorizzazione.

Io vedo il problema di come essere suddiviso in aree specifiche:

  1. Dati Storici
  2. Futuro, A Breve Termine, I Dati
  3. In Futuro, I Dati A Lungo Termine

Con le seguenti sottoclassi in:

  1. Sistema Fornito
  2. Utente, A Condizione Che

Vediamo uno alla volta.

Sistema Fornito:Vorrei raccomandare l'esecuzione di sistemi UTC, quindi si evita il problema di fuso orario e di nuovo, senza perdita di informazioni è visto (è sempre UTC).

Dati Storici:Queste sono cose come le file di registro di sistema, di processo, di statistiche, analisi, commento di date/orari, ecc.I dati non cambierà, e il fuso orario descrittore non ha intenzione di cambiare retroattivamente.Per questo tipo di dati, non vi è alcuna perdita di informazioni per la memorizzazione delle informazioni in formato UTC, indipendentemente dal fuso orario e ' stato fornito in.Quindi, rilasciare il fuso orario.

In Futuro, I Dati A Lungo Termine:Questi sono eventi che sono abbastanza lontano nel futuro o mantenere accadendo.Se sono tenuti in giro abbastanza a lungo, il fuso orario descrittori sono garantiti cambiare.Un buon esempio di questo tipo di dati", Il Settimanale Riunione di direzione".Questo è un dato che viene inserito una sola volta, e prevede di continuare a lavorare in perpetuo.Per questi valori, è importante per determinare se è di sistema o utente fornito.Per i dati forniti dall'utente, il tempo deve essere conservata con il creatore del fuso orario, il resto risultati in perdita di informazioni.Questa perdita di informazioni diventa evidente quando la definizione di fuso orario cambia e il tempo viene visualizzato al creatore, come avere un altro valore!

Come Bwooce ha indicato, c'è un po ' di confusione in cui il creatore e spettatore sono in fusi orari diversi.In quel caso, si prevede che l'applicazione per indicare che i valori di tempo si sono spostati a causa del fuso orario spostamento dalle loro posizioni precedenti.

Futuro, A Breve Termine, I Dati:Questo è un dato che sta rapidamente andando a diventare storica, o è valido solo per un breve periodo di tempo.Gli esempi potrebbero essere timer a intervalli, valutazione di transizioni, etc.Per questo i dati, dal momento che la probabilità è bassa, la definizione cambia tra la creazione di valore e il tempo diventa storica, potrebbe essere possibile ottenere via con fare cadere il fuso orario.Tuttavia, ho trovato che questi valori hanno la cattiva abitudine di diventare "in Futuro, i Dati a Lungo Termine".

Una volta che avete deciso di archiviare il fuso orario, la cura deve essere presa con le modalità di archiviazione.

  • Non conservare il fuso orario come offset, o il descrittore.

Se si memorizza un fuso orario come offset, che cosa fare se il fuso orario cambia?Vai attraverso il sistema e fare una coperta di modifica dei dati esistenti?Se si, hai fatto qualsiasi storici valori non corretti.Buoni esempi di questo errore sono Oracle e iCal.Oracle memorizza informazioni di fuso orario come un offset dall'UTC, e iCal che fanno il descrittore per la creazione di fuso orario.

  • Non conservare il nome.

Questo permette la definizione di fuso orario a modifiche senza dover modificare l'esistente valori.Si fa la cernita più difficile, dal momento che qualsiasi indice che viene generato può essere nullo se il fuso orario di modifica dei dati.

Se gli sviluppatori continuano a salvare tutto in UTC, indipendentemente dal fuso orario, continueremo a vedere i problemi che abbiamo visto con l'ultimo lotto di cambiamenti di fuso orario.

In una sola organizzazione, i segretari dovevano stampare i calendari per le loro squadre prima dell'ora legale data, e poi stamparli dopo la modifica.Infine, sono stati confrontati i due e ri-creato tutti gli appuntamenti che si era mossa.Naturalmente, hanno perso diversi, e c'erano diverse settimane di dolore fino a quando il vecchio legale data è stato raggiunto e i tempi diventano corrette.

Josh è completamente corretto sopra, ma ho un sottile avvertimento a spiegare.Questo è un caso senza risposta corretta in merito a futuri eventi e fusi orari.

Si consideri il caso di un appuntamento ricorrente.Essa si verifica a 0000 GMT (per semplicità), che è di 1200 NZST (Nuova Zelanda Standard Time) e 1000 AEST a Sydney in Australia.

Quando l'ora legale entra in vigore in una zona, ciò deve verificarsi per la nomina?Dovrebbe:

1a.Se il TZ cambiamento è nella zona di l'appuntamento del "proprietario" (che prenotato) per poi tentare di rimanere a lo stesso orologio dello scrittorio di tempo (ad esempio 10:00)?
1b.Se il TZ di cambiamento in una delle altre riunione del partecipante zone, poi non cambiare

Conseguenze:Si muove per tutti gli altri, inaspettatamente, a causa i proprietari TZ cambiare, ma rimane "il 10 incontro" per quanto riguarda i il proprietario è interessato.

'2.Come sopra, ma al contrario.

Conseguenze:Si muove per il proprietario della riunione (il 10 riunione diventa il 9 riunione, o v/v), che può essere previsto, ma scomodo.Rimane allo stesso tavolo di un orologio, per gli altri partecipanti fino a che non passano attraverso i loro propri TZ transizione.

Nessuno è perfetto.Si consideri il caso di due appuntamenti, uno prenotato da Una Persona che si verifica alle 10 ora locale, le altre prenotato per Persona in B con Una Persona come un partecipante che si verifica alle ore 9.Se Una Persona e la Persona B sono diversi TZ una modifica dell'ora legale potrebbe facilmente causare loro di diventare il doppio-prenotato.

Se la tua mente è un po ' piegato a questo punto, allora capisco.

Il punto dietro questo esempio è che per fare uno di questi comportamenti correttamente è necessario conoscere non solo l'UTC versione locale del tempo, ma il TZ (e non l'offset) che il proprietario era in quando hanno prenotato.Altrimenti non hai scelta, ma per prendere l'opzione 2, in silenzio, senza nemmeno informare chiunque che le cose sono cambiate da quando GMT volte non cambia e solo la presentazione cambia...giusto?(no, questa è la trappola, la presentazione di questioni quando il 10 incontro si muove da solo)

Devo credito il mio collega e amico Jason Pollock per questa intuizione.Leggi la sua vista qui, e il follow-up a discutere iCal e VTIMEZONE qui.

L'archiviazione di tutto il GMT/UTC sembra più logico per me.È quindi possibile visualizzare la data e l'ora in ogni fuso orario che si desidera.

Un paio di ceveats:

  1. Se un tempo è solo specificato come orologio da parete tempo e che è la leader rappresentazione, allora è non è assolutamente un periodo di tempo specificato.Si dovrebbe (e non) a convertirlo in ogni GMT rappresentazione.E. G.9:00 SONO ogni mattina.In altre parole:questo non è il (data)tempo.
  2. Se si salvare una data e l'ora di un futuro appuntamento, si dovrebbe utilizzare il offset GMT specificato da ingresso il fuso orario e la il momento nel tempo stesso.Quindi, se si tratta di un appuntamento in estate made in inverno, ad esempio,europa occidentale, è +2:00, allthough normale (orario invernale) offset +1:00.Questo per risolvere il calendario problema che Bwooce menzionati.
  3. Naturalmente, lo stesso che si riferisce all'utilizzo di destra offset durante la conversione GMT si applica quando la conversione di un la data e l'ora in ogni particolare fuso orario.

Per fortuna, se usato correttamente, il (.NET) di tipo DateTime si prende cura di tutti i dettagli scabrosi di talmente semplice mantenere aggiornati i calendari etc.per voi e tutto questo dovrebbe essere molto facile quando si sa come funziona.

Personalmente, non vedo alcun motivo per non archiviare il tutto in GMT e quindi utilizzare gli utenti di fuso orario locale a visualizzare l'ora in cui si riferisce a loro.

Se si desidera visualizzare il tempo relativo, ovviamente ancora bisogno di tempo e fare una traduzione, ma se si vuole fare la traduzione penso GMT è ancora l'opzione migliore.

Così ho fatto un piccolo esperimento con MSSQL server.

Ho creato una tabella e aggiunto una riga con l'attuale localizzato il fuso orario (Australia).Poi ho cambiato il mio datetime essere GMT aggiunta un'altra riga.

Anche tho quelle righe sono state aggiunte circa 10 secondi di distanza, appaiono in SQL server come tho sono 10 ore di distanza.

Se non altro, almeno mi dice che dovrebbe essere la memorizzazione di date in un conisitent modo, che per me, aggiunge peso all'argomento per la loro memorizzazione come GMT.

MS Dynamics negozi GMT e quindi a livello utente conosce i tempi di zona relative al GMT.Visualizza articoli nel tuo fuso orario.

Ho pensato di buttare quello che c'è fuori come un abbastanza grande gruppo di MS e questo è il modo in cui ha deciso di gestirlo.

io preferisco archiviare il tutto con il fuso orario.il cliente può decidere, in che modo, dovrebbe essere presentato in seguito.il mio preferito in libreria per la conversione è il PostgreSQL Database.

Date un'occhiata qui, il w3c ha fatto un lavoro eccellente per rispondere a questa domanda.

Guarda i casi di utilizzo.

http://www.w3.org/TR/timezone/

Nota che si consiglia di conservare datetimes come UTC non GMT GMT è soggetto all'ora legale.

Mi piace la memorizzazione di GMT e mostrando solo relativa ("circa 10 secondi fa", "5 mesi fa").Gli utenti non hanno bisogno di vedere reali timestamp per la maggior parte dei casi di utilizzo.

Ci sono certamente eccezioni, e una singola applicazione, potrebbe avere molti di loro, in modo che non possa essere vero senso della risposta.Le cose che hanno bisogno di forti audit-capacità (ad es.di voto), e sistemi in cui il tempo è parte del dominio del discorso (astronomia, ricerca scientifica) può richiedere la vera timestamp per essere mostrato all'utente.

La maggior parte delle applicazioni, anche se, sono più facile da capire con un semplice tempo relativo.

Io di solito basta usare Unix tempo.non necessariamente futuro sicuro, ma funziona abbastanza bene.

Conservare sempre in GMT (o UTC).Da lì è facile da convertire in qualsiasi fuso orario locale valore.

Le date dovrebbero essere archiviati come UTC, a MENO che l'utente ha fornito dati e NON si può sapere cosa fuso orario l'utente che i dati siano in.A volte (molto raramente), è necessario solo il negozio di ora, minuti, secondi, giorno, mese e anno, senza alcun fuso orario in modo che si può sputare fuori per l'utente.Ora per i nuovi sviluppatori o se non siete sicuri, negozio UTC e sarà il 99% di risposte corrette.

Ma non fatevi ingannare credendo che questo funziona al 100% per tutti i casi per tutto il tempo.Non è così.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top