Prędzej czy później, każdy programista ma do czynienia ze strefami czasowymi.
I tak naprawdę nie mogę niczego poradzić. Mogę natomiast zaoferować opowiastkę-przestrogę.
Mogę powiedzieć, dlaczego nigdy, przenigdy nie powinieneś użerać się ze strefami czasowymi jeśli to tylko możliwe.
Wyobraźmy sobie, że ktoś napisał aplikację
która pozwala obliczyć, ile sekund minęło od jakiegoś wydarzenia w przeszłości.
Wpisujesz datę i czas, a aplikacja podaje liczbę sekund jaka minęła.
I patrzysz na nią i myślisz: "OK, to mi się przyda...
...ale dodajmy takie okno, które pozwoli zmienić strefę czasową"
Więc jeśli porównujesz między 'teraz' w Nowym Jorku, a pięcioma dniami temu w Londynie, aplikacja zadziała.
I to jest w porządku - mała rozwijana lista pozwala na zmianę, ile godzin do przodu lub do tyłu jesteś od Greenwich.
Wspaniale.
Prędzej czy później, gdy aplikacja zrobi się nieco bardziej popularna, otrzymasz telefon z Australii.
I Australia powie "Szczynść Bo..."
- Nie, nie zamierzam próbować bawić się w akcenty.
Ja po prostu nie powinienem robić akcentów.
Australia powie "Cześć!
Nawiasem mówiąc, jesteśmy 9½ godziny przed Greenwich."
A programista powie: "Naprawdę?"
"Tak, 9 ½ godziny."
"OK, dodam dla was szczególny przypadek i będzie ok"
Nieco później, ktoś zadzwoni z Nepalu.
A oni powiedzą "Cześć. Jesteśmy 5¼ godziny po Greenwich."
A ty powiesz "naprawdę?" - "Tak, tak było przez lata! 5¼ godziny!"
Wspaniale. W porządku. I wstawisz kolejny specjalny przypadek. A może dodatkowo popatrzysz
na listę stref czasowych, która mówi
jak jest i wstawisz każdą strefę jaka jest na świecie.
A potem przyjdzie jesień.
I zadzwonią do ciebie z Anglii.
I Anglia powie: "Przepraszamy. Um, jesteśmy przesunięci o godzinę, co się dzieje?
Zmieniliśmy czas na zimowy!"
"Nie no, jest ok. Przecież już rozpatrzyliśmy
zmiany czasu i uwzględniliśmy to w naszym systemie"
I Anglia powie: "Nie, bo u nas czas zmienia się o tydzień wcześniej.
To zależy od miejsca zamieszkania.
My przesuwamy nasze zegary o tydzień wcześniej zanim wy to robicie."
I w tym momencie
zazwyczaj programista chwyta się za głowę
i zdaje sobie sprawę w co się wpakował.
Ale nie, jest w porządku!
Uwzględnimy również to i będziemy zmieniać czas w innym dniu w zależności od kraju.
I popatrzymy na plik, w którym będzie opisane, jak to robić.
Potem dostaniesz telefon od kogoś, na półkuli południowej, który znów powie
"Tak, no my nie cofamy zegarów na zimę, tylko je przesuwamy do przodu.
Nasza wiosna... jest w listopadzie."
W tym momencie zaczynasz patrzeć na swoich współpracowników
i zastanawiasz się, czy nie powinieneś sobie strzelić setki przed kontynuowaniem...
...i dodasz również to do swojego programu.
I wtedy dostaniesz telefon z Samoy
na Pacyfiku, gdzie jest Międzynarodowa Linia Zmiany Daty.
I Samoa powie: "Hejka!
No bo my przeskoczyliśmy jeden dzień w tamtym roku."
A programista powie "Że co??"
"Tak pominęliśmy dzień. Z dnia 29 grudnia 2011 roku do 31 grudnia.
Przesunęliśmy się z jednej strony Lini Zmiany Daty (z godzinami do tyłu względem Greenwich...
...do bycia godziny przed Greenwich). Pomaga nam to w handlu z Australią.
Czy możecie mieć to na uwadze, gdy obliczacie ile sekund rzeczy są w przeszłości?"
[Głęboki oddech] No dobrze, jest to w pliku, który mówi, kiedy który kraj zmienia strefę czasową.
Okazuje się, że dzieje się to dość często.
I oni ogłaszają to długo przed terminem, więc jeśli będziesz aktualizował ten plik na bieżąco
i wprogramujesz to w aplikację, to będzie w porządku.
Następnie patrzysz wstecz i zauważasz, że w czasie II Wojny Światowej,
Anglia miała podwójny British Summer Time (GMT+2)
i przeszła całkiem na BST a potem po prostu dodała dodatkową godzinę.
Tak więc była dwie godziny przed Greenwich pomimo tego, że ma Greenwich.
No ale ok, poradzisz sobie z tym.
Czy zauważyliście, że zacząłem mówić tak, jakbyś to był ty czy ja?
Ponieważ robiłem to już wcześniej i to naprawdę frustrujące.
I upewniasz się, że jesteś zapisany na listę
kiedy kraje zmieniają strefy czasowe - co się dzieje, jak widać, wiele razy!
Nawet, czasem, kilka razy w roku, ponieważ rządy zmieniają się.
A potem ten programista dostaje telefon z Libii,
która w 2013 roku, tylko z kilkudniowym wyprzedzeniem powiedziała, że nie przestawi zegarów do tyłu.
Z takim wyprzedzeniem, że ​​nie było możliwym dla kogokolwiek, aby zaktualizować swoje programy na czas.
Co oznaczało, że każdy komputer libijski, bez względu na to jaki system operacyjny posiadał...
...był o godzinę do tyłu.
Ale jest OK, przeczytałeś artykuł w Internecie i pospiesznie wkodowujesz to w swoją aplikację.
A potem, potem dostajesz połączenie z Zachodnim Brzegiem.
Gdzie ludność izraelska znajduje się w innej strefie czasowej dla ludności palestyńskiej.
Ponieważ jedni naśladują Izrael, a inni nie.
I teraz masz dwie populacje ludzi w tym samym miejscu, którzy są w różnych strefach czasowych.
I teraz oni wszyscy muszą pytać się nawzajem, czy są w tej strefie czasowej lub tej, w zależności od tego, kim i gdzie są one
I nie ma sposobu, aby zakodować to do twojego programu! I wtedy...
wtedy dostaniesz telefon od historyka.
Który mówi: "Próbuję obliczyć coś w XVIIIw.
a wtedy była zmiana z kalendarza juliańskiego na kalendarz gregoriański.
I to nie jest tak, że straciliśmy około trzy tygodnie...
...tylko, przeskoczyliśmy od tej daty do tej daty i pominęliśmy resztę.
Czy możecie zakodować to tak, żeby to dla mnie również działało?"
Ale jest ok, bo ktoś ci już powiedział, kiedy te terminy są,
i możesz zakodować to do swojego programu,
ale teraz wygląda to na naprawdę długi i bardzo skomplikowany program
i jest w nim wielki bałagan z kodem spaghetti, który o dziwo działa.
I następnie dzwoni do ciebie rosyjski historyk!
Który mówi: "Tak, tylko, że my zmieniliśmy kalendarz na gregoriański w XX wieku...
...i okazuje się, że pomijasz daty w zależności od lokalizacji...
...i czy możesz również to naprawić?". A następnie dzwoni do ciebie brytyjski historyk,
który mówi, że do czasu, myślę, że to było do XVI wieku...
rok rozpoczynał się 25 marca!
Tylko po to, żeby wybuchł ci mózg.
Z 24 marca 924r.
byłby 25 marca 925r. I to jest następny dzień.
Ponieważ już od 31 grudnia 924r przeszli do 1 stycznia 924r [sic], bo to idzie w tej kolejności!
To jest znacznie skomplikowane, A POTEM...
...dzwoni astrofizyk...
Który mówi: "Nawiasem mówiąc, właśnie mieliśmy sekundę przestępną!"
I w tym momencie, zadajesz sobie pytanie: "ŻE CO?!"
Sekunda przestępna (skokowa). Ponieważ ziemia nie obraca się ze stałą prędkością.
Zwalnia, przyspiesza, a płyty tektoniczne poruszają się
i pola magnetyczne przesuwają się, czy coś takiego. I tak od czasu do czasu
Międzynarodowa Unia Astronomiczna ustala, czy potrzebujemy następny skok.
Jeśli tak, to zegary idą z 23:59:58
na 23:59:59
a następnie zamiast na 00:00:00 jak każda rozsądna strefa czasowa zrobiłaby to
idzie na 23:59:60!
I wszystko się psuje, bo nagle masz 61 sekund w minucie!
Tak więc w zależności od implementacji, albo...
...twój zegar jest jedną sekundę asynchroniczny z resztą świata...
...albo powtarza sekundę.
Sposób, w jaki powinieneś sobie z tym poradzić to Uniksowy Znacznik Czasu [Unix Timestamp].
I Numberphile [kanał na YT], myślę, że mówił o tym wcześniej.
A więc masz tę liczbę, która rozpoczęła się na dokładnie pierwszej sekundzie 1970 roku
i zwiększa się o jedną sekundę, na sekundę.
Stale. Tik. Tik. Tik.
I to jest super, bo to, co powinieneś zrobić, bez względu na daną ci datę,
to wziąć i obliczyć ją jako Uniksowy Znacznik Czasu,
i umieścić ją w bazie danych.
I to sobie poradzi z sekundami przestępnymi.
OPRÓCZ TEGO, ŻE NIE! Oczywiście, że nie!
Ponieważ masz Uniwersalny Czas Koordynowany,
który obejmuje sekundy przestępne.
Powtarza się on od czasu do czasu, i po prostu zawiera 23:59:60.
Ale potem masz czas astronomiczny, który nie obejmuje sekund przestępnych
i stale dysharmonizuje się z resztą świata,
ponieważ musimy patrzeć na gwiazdy i projektować teleskopy wokół niego!
[głębokie westchnienie]
I to czego się nauczysz...
Czego nauczysz się po kontaktach ze strefami czasowymi, to to, że...
...odkładasz swój kod źródłowy...
...i nie próbujesz napisać nic co ma do czynienia z tym czymś.
Patrzysz na ludzi, którzy byli tam przed tobą.
Patrzysz na pierwszych ludzi. Ludzi, którzy mieli do czynienia z tym wcześniej,
na ludzi, którzy zbudowali kod spaghetti,
idziesz do nich i bardzo im dziękujesz za uczynienie z niego kodu otwartego [open source]
i dajesz im uznanie i bierzesz to, co zrobili i umieszczasz go w swoim programie,
i nigdy, przenigdy nie patrzysz się na niego ponownie.
Ponieważ w ten sposób unikasz obłędu.
Google ma naprawdę dobre podejście do sekundy przestępnej, które wymyślili sami.
Jest cały artykuł na ten temat na ich blogu, który wszystko wyjaśnia.
Robią coś, co nazywa się "rozmaz skoku" ["leap smear"]
Bo posiadanie 61 sekund w minucie
lub posiadanie zegaru cofającego się o sekundę,
może być bardzo, bardzo złe dla wielkich agencji, które muszą
zsynchronizować wszystko bardzo dokładnie i muszą wierzyć, że każdy jeden rząd danych zapisano przed innym,
muszą zasadniczo rozmazać sekundę podczas całego dnia.
Zwiększają więc oni swoje zegarki o mikrosekundy.
Tik ​​tik tik, przez cały dzień.
Więc czasami może być tak, że dany czas może różnić się nawet o pół sekundy od rzeczywistości,
ale dopóty wszystko na ich serwerach różni się o pół sekundy.
Jest zbudowany tak, by różnić się od świata o ile wie, że jeden zapis zdarzył się przed innym.
Bo ciągłość jest ważniejsza niż posiadanie faktycznego, dokładnego czasu.