Stocați totul în GMT?
Stocați tot așa cum a fost introdus cu o compensare încorporată?
Faci matematica de fiecare dată când faci?
Afișați relativ Times "acum 1 minut"?
Personal, nu văd nici un motiv să nu stocăm totul în GMT și apoi să folosim fusul orar local pentru a afișa ora în care se referă la acestea.
Dacă doriți să afișați timpul relativ, evident că aveți încă nevoie de timp și de a face o traducere, dar dacă doriți să faceți traducerea, cred că GMT este în continuare cea mai bună opțiune.
Îmi place să stocăm în GMT și să afișăm doar relativă ("acum aproximativ 10 secunde", "acum 5 luni"). Utilizatorii nu au nevoie să vadă facturi de timp reale pentru cele mai multe cazuri de utilizare.
Există, cu siguranță, excepții, iar o aplicație individuală ar putea avea multe dintre ele, deci nu poate fi un răspuns "într-adevăr adevărat". Lucrurile care au nevoie de o capacitate puternică de audit (de exemplu votarea) și sisteme în care timpul face parte din domeniul discursului (astronomie, cercetare științifică) ar putea solicita utilizatorilor să prezinte timbre precise.
Cele mai multe aplicații, cu toate acestea, sunt mai ușor de înțeles cu un timp relativ simplu.
Trebuie să stocați în UTC - dacă nu, raportarea și comportamentul dvs. istoric în timpul unor activități precum Economia de vară merge ... amuzant. GMT este un moment local, sub rezerva Sleep-urilor de vară în ceea ce privește UTC (care nu este).
Prezentarea către utilizatori în diferite zone de timp poate fi un bastard real dacă stocați timpul local. Este ușor să te adaptezi la local dacă datele brute sunt în UTC - trebuie doar să adaugi compensarea utilizatorului și ai terminat!
Joel a vorbit despre acest lucru într-unul dintre podcast-uri (într-un mod rotund) - a spus să să stocheze date în cea mai înaltă rezoluție posibilă (căutați "fidelitate"), pentru că puteți oricând să o spălați atunci când acesta va ieși din nou. De aceea spun că păstrează-l ca UTC, ca ora locală pe care trebuie să o ajustați pentru oricine nu este în acea fus orar, și asta este o muncă foarte grea. Și trebuie să păstrați dacă, de exemplu, economisirea de vară a fost în vigoare atunci când ați stocat timpul. Yuk.
Adesea în bazele de date din trecut am stocat două - UTC pentru sortare, ora locală pentru afișare. În acest fel, nici utilizatorul, nici computerul nu se confundă.
Acum, pentru a afișa: Sigur, puteți face lucru "în urmă cu 3 minute", dar numai dacă stocați UTC - în caz contrar, datele introduse în diferite fusuri orare vor face lucruri cum ar fi afișează "-4 ore în urmă" ciudați oamenii. Dacă doriți să afișați un moment real, oamenii preferă să aibă loc la ora locală - iar dacă datele sunt introduse în mai multe fusuri orare, puteți face acest lucru cu ușurință dacă stocați UTC.
Așa că am făcut un mic experiment cu serverul MSSQL.
Am creat o masă și am adăugat un rând cu fusul orar localizat curent (Australia). Apoi mi-am schimbat data până la ora GMT și am adăugat un alt rând.
Chiar și acele rânduri au fost adăugate în jurul valorii de 10 secunde în afară, ele apar în serverul SQL, deoarece acestea sunt la distanță de 10 ore.
Dacă nu altceva, cel puțin îmi spune că ar trebui să stochez datele într-o manieră conștientă, ceea ce pentru mine adaugă greutate argumentului pentru stocarea lor ca GMT.
MS Dynamics stochează GMT și apoi la un nivel de utilizator știe zona dvs. de timp relativ la GMT. Apoi vă afișează articole în fusul orar.
M-am gândit că o să arunc asta acolo, pentru că este un grup destul de mare la MS și așa au hotărât să o facă.
Întotdeauna stocați în GMT (sau UTC). De acolo este ușor să convertiți la orice valoare locală a fusului orar.
Josh este complet corect, dar am o precizare subtilă de explicat. Acesta este un caz în care nu există un răspuns corect privind evenimentele și fusurile orare viitoare.
Luați în considerare cazul unei întâlniri repetate. Se întâmplă la GMT 0000 (pentru simplitate), care este 1200 NZST (New Zealand Standard Time) și 1000 AEST în Sydney Australia.
Când economia de vară intră în vigoare într-o singură zonă, ce ar trebui să apară la întâlnire? Ar trebui:
1a. Dacă schimbarea TZ este în zona de numirea "proprietarului" (cine rezervați-l) apoi încercați să rămâneți la același timp de ceas de birou (de exemplu, ora 10:00)? 1b. În cazul în care Schimbarea TZ este una dintre celelalte întâlnirea zonelor participantului, atunci nu Schimbare
Consecințe: Se mișcă oricine altcineva, în mod neașteptat, din cauza proprietarii TZ se schimbă, dar rămâne "reuniunea de la ora 10" în ceea ce privește proprietarul este interesat.
„2. Ca mai sus, dar inversat.
Consecințe: Se mută pentru proprietarul întâlnirii (întâlnirea de 10am devine ședința 9am sau v/v), care poate fi de așteptat, dar incomod. Rămâne la aceeași oră de lucru pentru ceilalți participanți, până când trece prin propria tranziție TZ.
Nici nu este perfectă. Luați în considerare cazul a două întâlniri, unul rezervat de persoana A care are loc la ora locală 10:00, celălalt rezervat de persoana B cu persoana A ca participant care are loc la ora 9 dimineața. Dacă Persoana A și Persoana B se află în diferite TZ, atunci o schimbare DST ar putea provoca cu ușurință ca acestea să devină rezervate dublu.
Dacă mintea ta este puțin îndoită în acest moment, atunci înțeleg destul de bine.
Punctul din spatele acestui exemplu este că pentru a face oricare dintre aceste comportamente în mod corespunzător, trebuie să știți nu doar versiunea UTC a timpului local, ci TZ (și nu offsetul) că proprietarul era în momentul când l-au rezervat. În caz contrar, nu aveți de ales decât să luați opțiunea 2, în tăcere, fără să informați pe nimeni că lucrurile s-au schimbat de când ori GMT nu se schimba și numai schimbările de prezentare ... dreapta? (nu, aceasta este capcana, prezentarea contează atunci când întâlnirea dvs. de 10am se mută singură)
Trebuie să-i cred pe colegul și pe prietenul meu Jason Pollock pentru această înțelegere. Citește viziunea lui aici și urmărirea discutarea iCal și VTIMEZONE aici.
Răspunsul, ca întotdeauna, este "depinde".
Depinde de ce descrieți cu timpul și de modul în care ați fost furnizați datele. Cheia pentru a decide cum să păstrați valorile de timp este să decideți dacă pierdeți informații prin abandonarea zonei de fus orar și să nu uitați utilizatorii.
Există beneficii clare în stocarea datelor într-un time_t UTC - este un singur int, care permite o sortare rapidă și o stocare ușoară.
Văd problema ca fiind defalcată în domenii specifice:
Cu următoarele subclase pe fiecare:
Să ne uităm la ele unul câte unul.
System Provided: I would recommend running systems in UTC, then you avoid the timezone problem and again, no information loss is seen (it's always UTC).
Historical Data: These are things like system log files, process statistics, tracing, comment dates/times, etc. The data isn't going to change, and the timezone descriptor isn't going to change retroactively. For this type of data, there is no information lost by storing the information in UTC regardless of the timezone it was provided in. So, drop the timezone.
Future, Long Term Data: These are events that are either far enough in the future or will keep happening. If they are kept around long enough, the timezone descriptors are guaranteed change. A good example of this type of data is, "The Weekly Management Meeting". This is data that is entered once, and expected to keep working into perpetuity. For these values, it is important to determine if it is system or user provided. For user-provided data, the time should be stored with the creator's timezone, anything else results in information loss. This information loss becomes apparent when the timezone definition changes and the time is displayed to the creator as having an entirely different value!
După cum a indicat Bwooce, există o anumită confuzie în care creatorul și spectatorul se află în diferite fusuri orare. În acest caz, m-aș aștepta ca aplicația să indice ce valori de timp s-au mutat din cauza unei treceri de fus orar de la locațiile lor anterioare.
Future, Short Term Data: This is data that is quickly going to become historical, or is only valid for a short period of time. Examples could be interval timers, rating transitions, etc. For this data, since the likelihood is low that the definition will change between the creation of the value and the time it becomes historical, it might be possible to get away with dropping the timezone. However, I have found that these values have a bad habit of becoming "Future, Long Term Data".
Odată ce ați decis să stocați fusul orar, trebuie să aveți grijă de modul în care este stocată.
Dacă stocați o fus orar ca compensare, ce faceți dacă se modifică fusul orar? Treci prin sistem și faci o schimbare de pătură pe datele existente? Dacă faceți acest lucru, ați făcut acum toate valorile istorice incorecte. Exemple bune ale acestei erori sunt Oracle și iCal. Oracle stochează informațiile de fus orar ca o compensare de la UTC, iar iCal include descriptorul complet pentru fusul orar de creare.
Aceasta permite modificarea definiției zonei de fus orar fără a fi nevoie să modificați valorile existente pe care le aveți. Aceasta face ca sortarea să fie mai dificilă, deoarece orice index care este generat poate fi nevalid dacă datele de fus orar se modifică.
Dacă dezvoltatorii continuă să stocheze totul în UTC, indiferent de fusul orar, vom continua să vedem problemele pe care le-am văzut cu ultimul lot de schimbări de fus orar.
La o singură organizație, secretarii au trebuit să tipărească calendarele pentru echipele lor înainte de ziua de economisire a zilei și apoi să le tipărească din nou după schimbare. În cele din urmă, au comparat cele două și au re-creat toate întâlnirile care s-au mutat. Desigur, au ratat mai multe, și au existat câteva săptămâni de durere până când sa ajuns la data de vechime a luminii de vară, iar vremurile au devenit din nou corecte.
Prefer să stochez totul cu fusul orar. clientul poate decide, în ce mod ar trebui prezentat ulterior. biblioteca mea preferată pentru conversie este Baza de date PostgreSQL .
Stocarea totului în GMT/UTC pare cel mai logic pentru mine. Apoi puteți afișa data și ora în fiecare fus orar dorit.
Câteva ceveate:
Din fericire, atunci când este utilizat corect, tipul (.NET) DateTime are grijă de toate detaliile gorive de păstrare a calendarelor etc. pentru tine și toate acestea ar trebui să fie foarte ușor atunci când știi cum funcționează.
Aruncați o privire aici, w3c au făcut o treabă excelentă răspunzând la întrebare.
Uită-te la cazurile de utilizare.
http://www.w3.org/TR/timezone/
Rețineți că recomandă stocarea timpilor de date ca UTC nu GMT, GMT este supus la ora de vară.