Open Source im professionellen Einsatz
Linux-Magazin 02/2006

Datumsberechnungen

Perlsche Zeitmaschine

Datumsberechnungen haben ihre Tücken, denn Kalenderregeln sind historisch und sogar von politischen Entscheidungen beeinflusst. Perls »DateTime«-Modul kennt alle Tricks.

577

Wenn ein Backup-Skript um zehn Uhr abends startet und um vier Uhr nachts erfolgreich abschließt, wie lange läuft es dann? Sechs Stunden? Kommt drauf an. Denn was ist, wenn der Prozess in der Nacht vom 25. auf den 26. März 2006 irgendwo in Deutschland läuft? Da wird um zwei Uhr nachts die Uhr um eine Stunde vorgestellt, die korrekte Antwort ist dann: fünf Stunden.

Liefe der gleiche Prozess zur selben Zeit in den USA, hieße die Antwort sechs Stunden, da dort die Sommerzeit-Umstellung eine Woche später erfolgt. Allerdings nicht im Bundesstaat Indiana, der bis dato keine Sommerzeit kennt. Dieses Jahr soll aber erstmals umgestellt werden [2]. Selbst solcher Wirrwarr bringt das vom CPAN erhältliche Modul »DateTime« [5] aber glücklicherweise nicht aus dem Tritt.

Seit wann gibt es in Deutschland die Sommerzeit? Das Skript »dsthist« (Listing 1) findet es heraus, indem es vom Jahr 2000 an rückwärts schreitet und jeweils durch alle Märztage rattert, um herauszufinden, ob irgendwann 3 Uhr herauskommt, wenn man eine Sekunde zur Uhrzeit 01:59:59 addiert. Findet es keinen Schalttag, stoppt es:

...
1984: DST
1983: DST
1982: DST
1981: DST
1980: No DST

Die Ausgabe zeigt die Antwort: 1981 war das erste Jahr.

Summer in the City

In Europa ist die Sommerzeit ja relativ einheitlich geregelt. Nicht so auf dem amerikanischen Kontinent, wo sie in den englischsprachigen Ländern "Daylight Savings Time" genannt wird, da die Einwohner durch sie effizienter mit dem Tageslicht umgehen sollen.

Aber nicht nur die vielen Länder des großen Kontinents haben ihre individuelle Vorstellung von Sommerzeit. Selbst einzelne Bundesstaaten der USA kochen ihr eigenes Süppchen, manche Landbezirke weichen sogar wieder von den Regelungen ihres Bundesstaats ab. Zudem haben sich diese Regeln natürlich im Laufe der Geschichte gewandelt.

Listing »dstchk« (Listing 2) holt alle Zeitzonen, die dem Modul »DateTime::TimeZone« (ebenfalls auf dem CPAN erhältlich) bekannt sind, mit »all_names()« hervor, fährt den ersten Januar des gegenwärtigen Jahres in der gerade untersuchten Zeitzone an und zählt sechs Monate hinzu. Kommt ein Datum heraus, dessen Stundenwert ungleich null ist, deutet dies darauf hin, dass in der ersten Jahreshälfte eine Zeitverschiebung eingetreten und damit die entsprechende Zeitzone irgendwann während dieser Zeitspanne in die Sommerzeit übergegangen ist.

Ortszeiten

Die Zonen liegen normalerweise im Format Kontinent/Stadt vor, so zumindest für »Europe/Berlin« (ganz Deutschland), »America/New_York« (der Bundesstaat New York in den USA), »America/Vancouver« (der kanadische Bundesstaat British Columbia) und »Pacific/Honolulu« (das zur USA gehörende Hawaii). Ist aber zum Beispiel ein Landkreis in seiner gewählten Zeitzone oder Sommerzeitregelung irgendwann einmal von der des Bundesstaats abgewichen, wird weiter untergliedert.

So bezeichnet »America/Kentucky/Louisville« den US-Bundesstaat Kentucky, dessen größte Stadt Louisville ist. Die Hauptstadt von Kentucky ist, wie in den USA nicht ungewöhnlich, ein völlig unbekanntes Nest namens Frankfort. Da allerdings ein Landkreis in Kentucky - Monticello - bis zum Jahr 2000 einer anderen Zeitzone angehörte, führt »DateTime::TimeZone« auch einen Eintrag für »America/Kentucky/Monticello«. Abbildung 1 zeigt die Ausgabe von »dstchk«, das Sommerzeitbezirke mit »Term::ANSIColor« grün anzeigt.

So kann »DateTime« in allen denkbaren Zeitzonen rechnen, sogar mit Daten der Vergangenheit in Zeitzonen, die sich historisch entwickelt haben. Die Australien vorgelagerte Insel Lord Howe Island kapriziert sich sogar mit einer Sommerzeit, bei der die Insulaner die Uhr nur eine halbe Stunde verstellen. Das Listing »lord_howe« (Listing 3) zeigt, dass sich dort eine lokale Ortszeit von 02:30:00 ergibt, falls man zu 2005-10-30 01:59:59 nur eine Sekunde addiert.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Ein neuer Service auf Travis-ci.org listet fein säuberlich Github-Projekte eines Entwicklers auf, schickt den Code bei jedem Push durch deren Testsuites und gibt Rückmeldung, falls der Build bricht. In den zurückgelieferten Testergebnissen machen neugierige Perl-Skripte Zusatzinformationen sichtbar.

  • Perl-Snapshot

    Passend zum Titelthema: Mike
    Schilli nutzt Mouse und Moose, um
    Distributionsrepositories abzufragen.

  • Erwachet!

    Pünktlichkeit ist die Höflichkeit der Könige. Ein Perl-Daemon liest I-Calendar-Dateien mit Meeting-Terminen ein und alarmiert den User auf individuelle Weise kurz vor Beginn der Veranstaltung.

  • Datumsarithmetik

    Gehirnakrobaten rechnen gerne vor Publikum, auf welchen Wochentag ein zugerufenes Datum fällt. Den Trick kann auch Otto Normalrechner mit etwas Übung lernen. Ob er zuverlässig funktioniert, prüft das im Snapshot vorgestellte Skript mit aktueller Perl-Technologie.

  • Der Protokollant

    Trotz Konkurrenz durch andere Messenger, Twitter & Co.: IRC ist populär wie nie. Das Chat-Protokoll lässt außerdem selbst geschriebene Bots als automatische Helferlein zu. Im folgenden Beispiel protokolliert ein solcher Bot die Sitzung und archiviert sie in einer Datenbank.

comments powered by Disqus

Ausgabe 06/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.