Früher oder später muss jeder Programmierer einmal mit Zeitzonen fertig werden.
Und ich kann hier wenig Unterstützung bieten; Ich kann eine belehrende Geschichte erzählen.
Ich kann erklären, warum man niemals mit Zeitzonen arbeiten sollte, wenn man es vermeiden kann.
Nehmen wir an, dass jemand ein Programm geschrieben hat,
das ausrechnet, wie viele Sekunden ein Ereignis in der Vergangenheit liegt.
Man gibt ein Datum und eine Uhrzeit ein, und es berechnet die Anzahl der Sekunden.
Und man guckt sich das an und denkt: "OK, das funktioniert ganz gut für mich..."
"Aber lass uns eine kleine Box hinzufügen, mit der man die Zeitzone ändern kann."
Wenn man also zwischen Jetzt in New York und vor fünf Tagen in London vergleicht, dann kann man das ausrechnen.
Und das ist gut - das kleine Auswahlfeld lässt einen auswählen, wie viele Stunden vor oder nach Greenwich man ist.
Brilliant.
Früher oder später, nachdem das Programm etwas bekannter geworden ist, wird man einen Anruf aus Australien erhalten.
Und Australien wird sagen: "Servus--"
-- Ich werde keine Akzente versuchen.
Ich sollte einfach keine Akzente sprechen.
Australien wird sagen: "Hallo!"
"Nur am Rande, wir sind 9½ Stunden vor Greenwich."
Und der Programmierer wird sagen: "wirklich?"
"Ja, 9½ Stunden."
"OK, ich werde einen Sonderfall für Sie hinzufügen. Ist gut."
Ein bisschen später wird man aus Nepal anrufen.
Und die werden sagen: "Hallo. Wir sind 5¼ Stunden vor Greenwich."
Und man wird sagen: "wirklich?" "Ja, so ist das schon ewig! Ja, 5¼ Stunden!"
Gut. Okay. Und man wird einen Sonderfall hinzufügen. Und vielleicht wird man auch
eine Liste von Zeitzonen nachschlagen. Die offizielle Liste, die einem verrät,
was jeder ist, und man wird sicher gehen, dass alle Zeitzonen der Welt vorhanden sind.
Und dann wird der Herbst kommen.
Und man wird einen Anruf aus England erhalten.
Und England wird sagen: "Entschuldigen Sie. Nun, wir liegen aktuell eine Stunde daneben, was ist passiert?"
"Moment, die Uhren haben sich gerade geändert!"
"Schon gut - nein, das wussten wir."
"Wir haben eine Notiz gemacht, wann die Winterzeit einsetzt, und wir haben das eingebaut!"
Und England wird sagen: "Nein, sehen Sie, die Winterzeit beginnt für uns eine Woche früher."
"Es ist unterschiedlich, je nachdem wo man lebt."
"Wir stellen unsere Uhren eine Woche vor Ihnen zurück."
Und an diesem Punkt
wird der Programmierer generell anfangen, sein Gesicht in den Händen zu vergraben
und zu realisieren, wo er da hinein geraten ist.
Aber das ist Okay! Man wird das einbauen,
und man wird davon ausgehen, dass jedes Land an einem anderen Tag die Zeit umstellt.
Man wird sich die Datei angucken, die einem zeigt, wie das geht, und man wird das hinein kopieren.
Dann wird man wieder einen Anruf erhalten von jemandem aus der südlichen Hemisphäre, der sagen wird
"Naja, wir stellen die Uhren im Herbst nicht zurück, wir stellen sie vorwärts."
"Unser Frühling... ist im November."
An diesem Punkt wird man sehnsüchtig das Rauschmittel seiner Wahl in Blick nehmen
und sich fragen, ob man nicht einen kleinen Schluck nehmen sollte, bevor man weiter macht...
...und man wird auch das einprogrammieren.
Dann wird man einen Anruf aus Samoa bekommen.
Draußen im Pazifik, auf der internationalen Datumsgrenze.
Und Samoa wird sagen: "Hallo!"
"Nun ja, wir haben neulich einen Tag übersprungen."
Und der Programmierer wird sagen: "was?"
"Ja, wir haben einen Tag übersprungen. Wir sind vom 29. Dezember 2011 zum 31. Dezember gesprungen."
"Wir haben von der einen Seite der internationalen Datumsgrenze, wo wir Stunden um Stunden hinter Greenwich waren...
...zu der anderen Seite, wo wir Stunden um Stunden vor Greenwich sind, gewechselt. Das hilft uns beim Handel mit Australien."
"Können Sie das berücksichtigen, wenn Sie berechnen, wie viele Tage etwas sind und wie viele Sekunden etwas in der Vergangenheit liegt?"
[Tiefer Atemzug] Das ist in Ordnung, es gibt eine Datei, die auflistet, wann welches Land die Zeitzone gewechselt hat.
Tatsächlich passiert das relativ oft.
Aber das wird immer frühzeitig angekündigt, solange man also die Datei aktuell hält
und das in den Code einbaut, ist alles gut.
Dann schaut man zurück und bemerkt, dass England während des zweiten Weltkrieges
eine doppelte Sommerzeit hatte.
Man sprang auf die britische Sommerzeit und fügte dann einfach eine extra Stunde hinzu.
Also war man zwei Stunden vor Greenwich, obwohl... man selber Greenwich hatte.
Das ist in Ordnung, man baut das ein.
Haben Sie bemerkt, wie ich begonnen habe, so zu reden, als könnten das Sie oder ich sein?
Denn ich hab das schon mal getan, und es war sehr sehr frustrierend.
Und man stellt sicher, dass man die Liste aktuell hält,
in der steht, wann Länder ihre Zeitzonen ändern - was anscheinend öfters passiert!
Sogar manchmal mehrmals pro Jahr, weil sich Regierungen ändern.
Und dann bekommt dieser mythische Programmierer einen Anruf aus Libyen;
die 2013, mit nur ein paar Tagen Vorwarnung, entschieden, die Uhren nicht zurückzustellen.
Mit gerade genug Vorwarnung, dass es für niemanden möglich war rechtzeitig ein Update zu veröffentlichen.
Was bedeutete, dass jeder libysche Computer, egal mit welchem Betriebssystem,
eine Stunde falsch ging.
Das ist OK, man liest darüber in den Nachrichten und programmiert das hastig ein.
Und dann, dann bekommt man einen Anruf aus dem Westjordanland.
Wo die israelische Bevölkerung in einer anderen Zeitzone ist als die palästinensische.
Weil einer Israel folgt und einer nicht.
Jetzt hat man zwei Gruppen von Menschen am selben Ort, die unterschiedlichen Zeitzonen folgen.
Und es müssen immer alle wissen, ob sie in der einen Zeitzone sind oder in der anderen, je nachdem wer sie sind und wo sie sind.
Und es ist unmöglich, das in sein Programm einzubauen! Und dann...
Dann bekommt man einen Anruf von einem Historiker.
Er sagt: "So, ich versuche ein paar Zeitspannen im 18. Jahrhundert zu berechnen."
"Und wir haben vom Julianischen Kalender zum Gregorianischen Kalender gewechselt."
"Es ist nicht so, dass wir ungefähr drei Wochen verloren hätten ...
... es ist nur, dass wir geradewegs von diesem Tag zu diesem gesprungen sind, und die anderen verpasst haben."
"Können Sie es so programmieren, dass es das für mich quasi einberechnet?"
Es ist in Ordnung, weil einem schon jemand gesagt hat, wann diese Daten waren,
und man kann es einfach in seinen Code einbauen.
Aber nun sieht alles sehr sehr lang und kompliziert aus
und es ist ein verworrenes Chaos von Spaghetti Code der irgendwie funktioniert.
Und dann erhält man einen Anruf von einem russischen Historiker!
Er sagt: "Nun, wir verwenden den Gregorianischen Kalender erst seit dem 20. Jahrhundert ...
... und es stellt sich heraus, dass sich die übersprungenen Tage unterscheiden je nach Standort ...
... und kommen Sie damit auch klar?" Und dann bekommen Sie einen Anruf von einem britischen Historiker!
Der erklärt, dass bis, ich glaube es war das 16. Jahrhundert, ...
das Jahr am 25. März begann!
Nur um einen völlig zu verwirren.
Vom 24. März 924
ging man zum 25. März 925. Und das war dann der nächste Tag.
Denn man war vom 31. Dezember 924 zum 1. Januar 924 gegangen, das war einfach die Reihenfolge!
Es ist unglaublich kompliziert, UND DANN...
Bekommt man den Anruf vom Astrophysiker...
Der sagt: "Nur am Rande, wir hatten gerade eine Schaltsekunde!"
Und an diesem Punkt sagt man nur noch: "... was?!"
Schaltsekunden; denn die Erde rotiert nicht mit einer konstanten Geschwindigkeit.
Sie wird langsamer, schneller, während Tektonische Platten sich bewegen
und magnetische Felder sich verschieben, oder irgendwie so. Und somit wird gelegentlich
von der Internationalen Astronomischen Union entschieden, dass wieder eine Schaltsekunde benötigt wird.
Und wenn das der Fall ist, zeigen die Uhren 23:59:58
und dann 23:59:59
und dann, anstelle von 00:00:00, wie jede normale Zeitzone,
zeigen sie 23:59:60!
Und alles geht schief, denn plötzlich gibt es 61 Sekunden in einer Minute!
Abhängig von der Implementation wird die eigene Uhr also entweder ...
... um eine Sekunde aus dem Takt mit dem Rest der Welt geraten
oder eine Sekunde wiederholen.
Man verhindert das, indem man etwas verwendet, was sich Unix Zeit nennt.
Und Numberphile hat, soweit ich weiß, darüber schon mal ein Video gemacht.
Man hat diese Zahl, die in der allerersten Sekunde des Jahres 1970 begann
und jede Sekunde um eine Sekunde erhöht wird.
Konstant. Tick. Tick. Tick.
Und das ist prima, denn was man erreichen wollte, war, dass man das Datum nimmt, welches man bekommen hat
und den zugehörigen Unix Zeitstempel berechnet
und diesen in der Datenbank hinterlegt.
Und das wird einfach mit Schaltsekunden fertig werden.
TUT ES ABER NICHT! Natürlich nicht!
Denn es handelt sich um die Universal Coordinated Time,
die Schaltsekunden enthält!
Die Unix Zeit wiederholt gelegentlich eine Sekunde und schließt einfach 23:59:60 ein.
Und dann gibt es die Astronomische Zeit! Die enthält keine Schaltsekunden
und ist langsam aber sicher mit dem Rest der Welt aus dem Gleichgewicht geraten,
denn wir müssen die Sterne beobachten und Teleskope danach bauen!
[Tiefer Seufzer]
Und was man lernt...
Was man lernt, nachdem man mit Zeitzonen gearbeitet hat,
ist, dass man seinen Code wegtut ...
... man gar nicht erst versucht, selbst damit klar zu kommen.
Man guckt nach den Leuten, die das Problem vor einem hatten.
Man guckt nach den ersten Leuten, den Leuten, die das alles schon mal gelöst haben,
den Leuten, die den Spaghetti Code geschrieben haben,
und man dankt ihnen sehr dafür, dass sie es öffentlich gemacht haben,
und man gibt ihnen Anerkennung, nimmt was sie bereits getan haben, packt es in sein Programm
und schaut es sich nie wieder an.
Denn auf dem Weg liegt Wahnsinn.
Google hat tatsächlich einen sehr guten Ansatz für Schaltsekunden, den sie selbst erfunden haben.
Es gibt einen Artikel in ihrem Blog, ich glaube, der erklärt es.
Sie machen etwas namens "leap smear".
Weil 61 Sekunden in der Minute zu haben
oder die Uhr eine Sekunde wiederholen zu lassen
sehr sehr schlecht sein kann für riesige Agenturen,
die alles sehr präzise synchronisieren müssen und darauf vertrauen müssen, dass alles in der richtigen Reihenfolge gespeichert wird,
verteilt Google die Sekunde quasi über den gesamten Tag.
Sie fügen Mikrosekunde für Mikrosekunde hinzu.
Tick tick tick, den ganzen Tag lang.
Sodass sie zwar manchmal bis zu einer halben Sekunde neben der Realität liegen,
aber währenddessen alles andere auf ihrem Server auch eine halbe Sekunde falsch geht.
Es ist gebaut um mit der Welt asynchron zu sein, solange sicher ist, dass alles in der richtigen Reihenfolge passiert.
Kontinuität ist in dem Fall wichtiger als genaue Zeitmessung.