Manipularea zonelor de fus orar în depozit?

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"?

0
fr hi bn

12 răspunsuri

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.

0
adăugat
problema este, la ce oră se folosesc procesele automate atunci când comunică, de exemplu, termenele limită pentru oameni? păstrați fusul orar utilizatorilor așa cum au decis și îl utilizați în toate comunicările?
adăugat autor DevelopingChris, sursa

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.

0
adăugat
stocarea acestora cu un offset încorporat ar putea însemna, de asemenea, 2 coloane, timpul gmt și persoanele selectate offset, nu una automată formată sqlserver sau mașina client.
adăugat autor DevelopingChris, sursa

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.

0
adăugat
Dar, să presupunem că aveți un sistem de rezervare și rezervați o cameră într-o fus orar cu DST la 3 P.M. Când se întâmplă DST, diferența dintre GMT și fusul orar al sălii de ședință se modifică cu o oră. Dintr-o dată întâlnirea este rezervată la un moment diferit!
adăugat autor Joeri Sebrechts, sursa
Nu mi-a dat seama că nu mi-am dat seama că vei converti timpul în offsetul DST din momentul în care s-a întâmplat, așa că ar fi întotdeauna în poziția corectă.
adăugat autor Joeri Sebrechts, sursa
Nu, GMT nu are economii de zi. Dacă suntem pedanți, atunci nici UTC nu este o zonă de timp. GMT se bazează pe timpul mediu solar la Greenwich. UTC se bazează pe timpul Atomic (TAI) ajustat cu un număr întreg de secunde (cred că secundele de salt) pentru a rămâne aproape de faza solară a pământului, deși acestea pot diferi cu până la 0,9 secunde. Va trebui să vă întâlniți de câțiva ani pentru ca timpul de rotație al pământului să se schimbe în mod apreciabil, dar de aceea complexitatea există aici.
adăugat autor mc0e, sursa

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ă.

0
adăugat

De obicei folosesc doar timpul Unix. nu neapărat sigur în viitor, dar funcționează destul de bine.

0
adăugat

Î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.

0
adăugat

Întotdeauna stocați în GMT (sau UTC). De acolo este ușor să convertiți la orice valoare locală a fusului orar.

0
adăugat

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.

0
adăugat
Outlook Mobile devine confuz de exact acest bug comportament. Apelurile la telefon se schimba când schimba zona activă.
adăugat autor devstuff, sursa
@devstuff - întâlnirile care se schimbă atunci când selectați o altă fus orar nu este ceea ce este descris. Ceea ce se descrie este că fusul orar în sine sa schimbat (datorită modificărilor legale ale economiilor de vară) și, prin urmare, fusul orar în care datele au fost descrise inițial nu mai există. adică vremurile s-au schimbat în aceeași fus orar.
adăugat autor Mark, sursa

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:

  1. Date istorice
  2. Viitoare, date pe termen scurt
  3. Viitoare, date pe termen lung

Cu următoarele subclase pe fiecare:

  1. Sistemul furnizat
  2. Utilizator furnizat

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ă.

  • Nu păstrați fusul orar ca decalaj sau descriptorul complet.

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.

  • Stocați-l ca pe un nume.

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.

0
adăugat

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 .

0
adăugat

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:

  1. Dacă un anumit timp este specificat doar ca a timp de ceas de perete și că este conducerea reprezentării, atunci este nu un timp specificat. Ar trebui (și nu puteți) să îl convertiți în orice reprezentare GMT. DE EXEMPLU. 09:00 AM în fiecare dimineață. Cu alte cuvinte: acesta nu este data (data).
  2. Dacă sunteți     salvați o dată și o oră a unui viitor     întâlnire, ar trebui să utilizați     offset la GMT specificat de intrare     fus orar și momentul în timp     în sine . Deci, dacă este o întâlnire     vara făcută în timpul iernii, de ex.     Europa de Vest, este +2: 00,     deși timpul normal (timpul de iarnă)     offset este +1: 00. Aceasta va rezolva problema     problema calendare care Bwooce     menționat.
  3. Desigur, la fel care se aplică utilizării dreptului offset în timpul conversiei în GMT se aplică atunci când convertiți înapoi la data și ora în orice moment fus orar.

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ă.

0
adăugat

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ă.

0
adăugat