Előbb vagy utóbb minden programozónak foglalkoznia kell az időzónákkal.
És nem tudok hozzá semmilyen tanácsot adni, legfeljebb elmondhatok egy óva intő történetet.
Elmondhatom, miért ne foglalkozz soha, de soha az időzónákkal, ha van más lehetőséged.
Tegyük fel, hogy valaki csinált egy alkalmazást,
ami kiszámolja, mennyi idő telt el egy múltbéli időpont óta.
Beírod a dátumot és az időt és megkapod az eredményt másodpercekben.
És aztán ránéz a készítője és elgondolkozik, hogy "Oké, ez nálam működik...
de mi lenne, ha tennék bele egy kis dobozt, amivel időzónát lehet választani."
Szóval mondjuk ki tudná számolni az eltérést a jelenlegi New York-i idő és az öt nappal ezelőtti londoni idő közt.
És nincs is semmi gond, a kis lenyíló menüvel beállíthatjuk, hogy hány órával vagyunk Greenwich előtt vagy mögött.
Nagyszerű.
Valamivel később, miután egy kicsit elterjedt az alkalmazás, kapnak egy hívást Ausztráliából.
És azt mondja az ausztrál, hogy: – G'day ma–
...inkább nem próbálom meg utánozni az akcentust.
Meg sem kellene próbálnom.
Azt mondja az ausztrál, hogy: – Helló!
Egyébként, mi kilenc és fél órával vagyunk Greenwich előtt.
– Tényleg? – válaszol a programozó.
– Igen, kilenc és fél órával.
– Rendben, hozzáadom speciális esetként. Semmi gond.
Kicsivel később, hívják Nepálból.
És így szól a nepáli: – Helló, mi öt és egynegyed órával vagyunk Greenwich előtt.
Megint visszakérdeznek, hogy tényleg? – Igen, öt és egynegyed, így volt, mióta az eszemet tudom!
Remek. Oké, még egy speciális eset, beleírják ezt is. Aztán talán megkeresik a listát az
összes időzónával. A Nagy Listát, ami felsorolja
az összeset, és beleírják a világ összes időzónáját.
És utána jön az ősz,
és kapnak egy hívást Angliából.
És azt mondja az angol, hogy: – Elnézést, jelenleg egy órát téved a programjuk, mi történt?
Várjuk csak, most állítottuk át az órát!
– Nem, azzal semmi baj, azzal számoltunk!
Megnéztük, mikor kell átállítani az órát és beleírtuk a programba!
De az angol így szól: – Nem uram, látja, nálunk egy héttel korábban van az óraállítás.
Eltér attól függően, hogy hol él valaki.
Mi egy héttel hamarabb állítjuk vissza az órát, mint Önök.
Ezen a ponton
a programozó elkezdi a tenyerébe temetni a homlokát
és lassan rájön, mibe keverte bele magát.
De semmi gond! Beleírják azt is,
hogy az egyes országok mikor váltanak nyári időszámításra.
Kikeresik a fájlt, ami kilistázza az összeset és belemásolják az egészet.
Aztán megint hív valaki a déli féltekéről:
– De arra ugye figyeltek, hogy mi ősszel nem vissza, hanem előre állítjuk az órát?
Nálunk... novemberben van tavasz.
Innentől legtöbbször már kezdenek sóvárgó pillantásokat vetni kedvenc szeszes italuk üvegére és
elgondolkoznak, hogy vajon lehúzzanak-e egy felest, mielőtt folytatják...
és aztán belekódolják még ezt is.
Aztán felhívják őket Szamoából,
ami kint van a Csendes-óceánon, rögtön a dátumválasztó vonal mellett.
És köszön a szamoai, hogy: – Helló!
Azt ugye tudja, hogy pár éve kihagytunk egy napot?
–Micsoda? – szól vissza a programozó.
– Igen, igen, kihagytunk egyet. 2011. december 29-ről rögtön 2011. december 31-re ugrottunk.
Átkerültünk a dátumválasztó túloldalára; ahelyett, hogy sok-sok órával lennénk Greenwich mögött,
most sok-sok órával előtte vagyunk. Segíti a kereskedelmet Ausztráliával.
Figyelembe tudnák ezt venni, amikor kiszámolják, hány nappal, vagy másodperccel volt valami a múltban?
[mély sóhaj] Semmi gond, van egy fájl arról is, hogy melyik ország mikor váltott időzónát.
Úgy tűnik, nem is annyira ritka esemény.
Be szokták jelenteni jóval előre, szóval ha naprakészen tartjuk azt a fájlt,
és ezt is beletesszük a program logikájába, nem lesz semmi baj.
Aztán kiderül a fájlból, hogy a második világháború alatt
Anglia időzónája kétszeres Brit nyári idő volt.
Teljesen átálltak nyári időszámításra, aztán hozzáadtak még egy órát.
És így két órával voltak Greenwich előtt, annak ellenére, hogy Greenwich is pont ugyanott van.
Semmi gond, megoldjuk ezt is.
Észrevetted, hogy elkezdtem úgy beszélni, mintha mi csinálnánk ezt?
Csak mert nekem már volt dolgom ezzel, és nagyon, nagyon bosszantó.
Szóval nyomon követjük a naprakész listán,
hogy melyik ország mikor fog időzónát váltani – ami úgy tűnik, hogy egészen sokszor megesik!
Néha évente többször is, a kormányváltások miatt!
És aztán elbeszélésünk programozóját felhívják Líbiából,
ahol 2013-ban úgy döntöttek, hogy ők nem fogják visszaállítani az órát és csak pár nappal előtte szóltak.
Így hát nem volt ideje senkinek frissítést kiadni,
vagyis az összes líbiai számítógép, operációs rendszertől függetlenül...
...egy órát késett.
De semmi baj, látják a hírekben és nagy sietséggel belekódolják ezt is.
És aztán jön egy hívás Ciszjordániából,
ahol az izraeli és a palesztin népcsoportok két külön időzónát használnak,
mert az egyik Izrael idejét követi, a másik meg nem!
És innentől van két nép, ugyanazon a helyen, akik két külön időzónát használnak!
És innentől meg kellene őket kérdezni, hogy melyik időzónát akarják használni attól függően, hogy kicsodák és hogy hol vannak
és ezt sehogy sem lehetne belekódolni abba a programba! És aztán...
aztán felhív egy történész és így szól:
– Szóval, megpróbáltam kiszámolni néhány időt a 18. században.
De azóta átváltottunk a julián-naptárról a Gergely-naptárra.
Nem is az van igazán, hogy elvesztettünk három hetet...
...csak annyi, hogy erről a dátumról egyenesen erre a dátumra ugrottunk, ami közte van, azt kihagytuk.
Bele tudnák kódolni, hogy ezt is figyelembe vegye?
Semmi gond, valaki már elmondta, hogy mikor volt mindez
és bele lehet tenni ezt is a programba,
de itt már az egész egy hosszú, roppant bonyolult,
összegubancolt katyvasza a legrosszabb spagettikódnak; még valahogy működik is
DE aztán felhív az orosz történész!
És elmondja, hogy ők csak a 20. században váltottak a Gergely-naptárra...
és kiderül, hogy az átugrott időpontok is helyenként változnak...
...és ugye ezt is meg lehet oldani? És aztán visszahív a brit történész!
És azt mondja, hogy régen, hogyha jól emlékszik, a 16. századig...
március 25-én kezdődött az új év!
Csak hogy végképp eldobd az agyad.
924. március 24-e után
925. március 25-e következett. Az volt a következő nap.
924. december 31-e után 924. január 1-je jött, egyszerűen így működött, ez volt a sorrend!
Végtelenül bonyolult az egész és... ÉS AZTÁN...
felhív az asztrofizikus...
és így szól: – Egyébként, volt most egy szökőmásodperc!
És itt már csak úgy hozzáteszed, hogy: – Szökő-micsoda?
Szökőmásodperc! Ugyanis a Föld nem állandó sebességgel forog!
Néha lelassul, néha kicsit gyorsul attól függően, hogy hogyan mozognak a földkéreg lemezei
és hogyan változik a Föld mágneses tere, vagy valami hasonló. És így, néha
a Nemzetközi Csillagászati Unió kiszámolja, hogy be kell-e iktatnunk egy szökőmásodpercet.
És ha megteszik, akkor az óra azt fogja mutatni, hogy 23:59:58,
aztán 23:59:59
és aztán ahelyett, hogy 00:00:00-t mutatna, ahogy bármilyen ésszerű időzóna tenné, nem...
AZ LESZ RAJTA, HOGY 23:59:60!
ÉS MINDEN DARABJAIRA HULLIK, MERT HIRTELEN 61 MÁSODPERC VAN EGY PERCBEN!
Szóval, implementációtól függően,
az órád vagy sietni fog egy másodpercet a világidőhöz képest,
vagy megismétel egy másodpercet.
A mód, hogy mindezzel elbánj az Unix időbélyeg nevet viseli.
Azt hiszem, a Numberphile-on már volt szó róla,
hogy van ez a számláló, ami 1970 legeslegelső másodpercével indult el és
azóta számolja a másodperceket.
Állandóan. Tikk-takk, tikk-takk.
És ez nagyszerű, mert innentől elég, ha a kapott dátumhoz
kiszámolod a hozzá tartozó Unix időbélyeget
és azt tárolod el az adatbázisban.
És ez elbánik a szökőmásodpercekkel,
KIVÉVE, HOGY NEM! Persze, hogy nem!
Ugyanis van külön Egyezményes koordinált világidő,
amibe beleszámítanak a szökőmásodpercek!
Néha megismétel egy másodpercet, hogy számoljon a 23:59:60-nal.
És van külön csillagászati idő, ami nem tartalmazza a szökőmásodperceket
és egyre kevésbé van szikronban a világ többi részével,
mert igenis kell, hogy figyeljük a csillagokat és teleszkópokat tervezzünk hozzá!
[mély sóhaj]
És ami a tanulság...
amire rájössz, miután időzónákkal kellett foglalkoznod, hogy amit tenned kell az az, hogy
szépen kidobod a kódodat...
...meg sem próbálsz semmit írni, ami ezzel foglalkozik.
Végigtekintesz azokon, akik jártak már itt előtted.
Végigtekintesz a legelsőkön, azokon, akik ezt már megoldották,
akik már megcsinálták hozzá a spagettikódot
és odamész és teljes szívedből megköszönöd, hogy nyílt forrásúvá tették,
megemlíted őket a készítők között, aztán fogod, amit írtak, beilleszted a programodba
és soha többé rá sem nézel.
Mert nincs arra más, csak téboly.
A Google-nek van egy nagyon-nagyon jó megoldása a szökőmásodpercekre, amit saját maguk találtak ki.
Van róla egy cikk a blogjukon, ami elmagyarázza.
Úgy hívják, hogy "szökőmaszat".
Ugyanis akár a 61 másodperc egy percben,
akár a megismételt másodperc
nagyon bajos lehet az óriáscégeknek, akiknek
mindent nagyon precízen szinkronizálniuk kell, hogy biztosak legyenek benne, hogy egy bizonyos adatot egy másik előtt jegyeztek le.
Gyakorlatilag szétkenik azt az egy másodpercet az egész napra,
mikroszekundumonként tekerik előre az órájukat.
Tikk, tikk, tikk, át az egész napon.
Szóval lehet, hogy néha akár fél másodperccel késik vagy siet az órájuk a valósághoz képest,
de ez nem gond, ha az összes szerverük ugyanúgy késik, vagy siet fél másodpercet.
Úgy tervezték, hogy habár nincs szinkronban a világgal, mindig tudja, hogy mi mi után történt,
mert ez a folytonosság fontosabb a pontos időszámításnál.