In diesem Artikel lernst du, warum es keine gute Idee ist eigene Datenstrukturen für Zeiten zu bauen und wie dir das datetime Modul viel Arbeit abnimmt.

In fast allen größeren Projekten stößt du früher oder später auf die Aufgabe Zeiten zu speichern und zu modifizieren… Einfach Sekunden, Minuten, Stunden, Tage, Monate und Jahre speichern. Was kann da schon schiefgehen? Eine ganze Menge!

In den folgenden Zeilen erfährst du etwas über die Probleme, auf die bei der Entwicklung stoßen könntest und wie du sie umgehst.

Warum nicht selbst machen

Stell dir vor du schreibst ein Programm, bei dem du das Zeit Handling selbst machst. Stunden und Tage sind schließlich immer gleich lang, denkst du dir. Das ist komplexer als man denken mag. Es gibt politische Gründe, historische und astronomische Gründe die gegen eine Eigenentwicklung sprechen.

Politische Gründe

Stell dir vor es kommt ein User der fragt, ob du das Programm auch für die Zeitzone seines Landes bereitstellen kannst. Kein Problem. Einfach je nach Land eine Anzahl an Stunden auf deine Zeit aufaddieren bzw. abziehen und du hast die Zeit in einer anderen Zeitzone. Leider funktioniert das nicht so einfach!

Große Länder

Viele Länder wie Russland, Australien oder die USA erstrecken sich über mehrere Zeitzonen. Dementsprechend reicht das Land nicht aus, um eine Zeitzone zu bestimmen. Selbst die Stadt ist auch nicht zwangsläufig hinreichend, weil manche Orte mehrmals in einem Land vorhanden sind. In den USA gibt es beispielsweise 34 Orte mit dem Namen Springfield.

Und um die Verwirrung komplett zu machen, gibt es noch Orte wie Israel bzw Westjordanland, wo die Menschen in derselben Nachbarschaft unterschiedliche Zeitzonen benutzen können. Hintergrund ist, dass die Israelis und die Palästinenser sich nicht auf eine einheitliche Regelung geeinigt haben.

Unendlich viele Zeitzonen

Die einzige Möglichkeit wäre den User direkt zu Fragen welche Zeitzone er verwenden möchte. Auch das erweist sich als schwierig, weil Zeitzonen politische Konstrukte sind und sich dementsprechend jederzeit ändern können. Während die meisten bekannten Zeitzonen in ganzen Stunden voneinander abweichen gibt es auch Zeitzonen die das anders Handhaben. Länder wie Australien verwenden halbstündige Zeitzonen. Nepal verwendet sogar Viertelstunden: Die Nepal Standard Time ist genau 5 Stunden und 45 Minuten vor UTC (Koordinierte Weltzeit).

Praktisch müsstest du eine Liste von allen aktuellen Zeitzonen bereitstellen aus denen dein User wählen kann.

Zeitumstellungen

Angenommen du fragst den User nach einer Zeitzone. Irgendwann wird diese Zeitzone nicht mehr für den User passen, denn viele Länder ändern ihre Zeitzone einfach mitten im Jahr! So ist es in Europa und den USA üblich im Sommer auf die Sommerzeit (und im Winter auf die Winterzeit) zu stellen. Allerdings ist auch dies nicht unbedingt im ganzen Land gleich. So macht beispielsweise der US-Bundesstaat Arizona bei dieser Zeitumstellung gar nicht mit.

Darüber hinaus ist die Zeitumstellung nicht in allen Ländern zum selben Zeitpunkt. In England beispielsweise ist die Zeitumstellung eine Woche vor der in Deutschland.

Noch wilder wird es, wenn du die Länder von der südlichen Hemisphäre inkludierst. Dort ist Sommerzeit und Winterzeit im Vergleich zur nördlichen Hemisphäre vertauscht. Im September werden die Uhren in Chile eine Stunde vorgestellt. In Deutschland hingegen werden Ende Oktober die Uhren für die Winterzeit eine Stunde zurückgestellt.

Und dann gibt es noch Spezialfälle wie die Insel Samoa. Samoa liegt im Pazifik an der Grenze zwischen den großen Zeitzonen UTC-12 Stunden und UTC+12 Stunden. Dort ist es üblich gelegentlich einen Tag zu überspringen, indem in die benachbarte Zeitzone gewechselt wird. Angeblich hilft das beim Handel mit Australien.

Historische Gründe

Es gibt bzw. gab mehrere unterschiedliche Kalendersysteme. In Europa wurden hauptsächlich das julianische und das gregorianischen System genutzt. Im 16. Jahrhundert wurde in den meisten europäischen Lädnern vom julianischen zum gregorianischen Kalendersystem gewechselt. Dabei sind leider ein paar Wochen “übersprungen” worden. Das müsstest du beim Programmieren beachten.

In Russland ist man hingegen erst im 20. Jahrhundert zum gregorianischen Kalender gewechselt. Da das Jahr im gregorianische Kalender etwa 11 Minuten kürzer (und damit näher am astronomischen Jahr liegt) ist als das Jahr im Julianischen Kalender, musste in Ländern wie Russland eine andere Anzahl an Tagen übersprungen werden. Schließlich bedeuten 11 Minuten Unterschied etwa einen Tag alle 128 Jahre! Du müsstest beim Umrechnen ins andere System also auch beachten, für welchen Ort du es umrechnen willst.

Nebenbei: Einige religiöse Feiertage nutzen den julianischen Kalender übrigens noch immer. So feiert man Weihnachten in Russland am 7. Januar und nicht wie bei uns am 25. Dezember (bzw. Heiligabend am 24. Dezember).

Astronomische Gründe

Immer, wenn die Erde einmal um die Sonne fliegt nennen wir das ein Jahr. Und, wenn sie sich einmal um sich selbst dreht nennen wir das einen Tag. Leider sind diese Zeiträume nicht immer gleichlang.

Schaltjahre

Alle 4 Jahre wird am Ende des Februar ein Tag eingefügt. Dementsprechend ist ein Jahr eigentlich keine 365, sondern 365,2425 Tage lang. Durch Einfügung eines extra Tages alle 4 Jahre wird das wieder angepasst. Alle Jahreszahlen die durch 4 Teilbar sind, sind Schaltjahre. Es sei denn sie sind durch 100 und nicht durch 400 Teilbar. Um das zuverdeutlichen hier ein paar Beispiele von Jahreszahlen die zwar durch 4 teilbar sind, aber keine Schaltjahre sind: 1500, 1700, 1800, 1900, 2100, 2200, 2300, 2500… Ich nehme an du erkennst das Muster.

Schaltsekunden

Die Erde rotiert nicht immer in derselben Geschwindigkeit. Sie wird manchmal schneller oder langsamer. Das kann an der Verschiebung der tektonischen Platten liegen. Vielleicht auch an den sich ändernden Magnetfeldern… Genau weiß man das noch nicht. Auf jeden Fall entscheidet hierzulande die Physikalisch-Technische Bundesanstalt ob und wann wir eine Schaltsekunde brauchen. Natürlich kann das in anderen Ländern jemand anderes entscheiden, der dann zu einem anderen Ergebnis kommen könnte.

Pythons Datetime Modul

Klar, natürlich kannst du alles hier erwähnte in den deinen Code integrieren. Aber das muss nicht sein!

Es gibt nämlich andere Leute, die sich mit diesem Wahnsinn befasst haben. Ein paar dieser Wahnsinnigen waren die Ersteller des “datetime” Moduls.

Hier folgen ein paar Eindrücke über die Nutzung.

Datetime Objekte erstellen

Das datetime Modul nutzt Objekte der datetime.datetime Klasse, um einen Zeitpunkt darzustellen. Aktueller Zeitpunkt

import datetime

now = datetime.datetime.now()

print(type(date))
print (now)
<class 'datetime.datetime'>
2021-07-04 12:02:29.112587

Spezieller Zeitpunkt

import datetime

date = datetime.datetime(1990, 4, 4, 13, 55)

print(type(date))
print(date)
<class 'datetime.datetime'>
1990-04-04 13:55:00

Mit Datetime Objekten rechnen

Ein Zeitintervalobjekt (datetime.timedelta) speichert die Differenz zwischen zwei Zeitpunkten.

Zeitinverval berechnen

Wenn du Zeitpunkte voneinander abziehst gibt dir datetime ein timedelta Objekt.

import datetime

date1 = datetime.datetime(1990, 4, 4)
date2 = datetime.datetime(1991, 4, 4)
delta = date1 - date2

print(type(delta))
print(delta)
print(datetime.timedelta(days=-365))
<class 'datetime.timedelta'>
-365 days, 0:00:00
-365 days, 0:00:00

Zeitpunkte modifizieren

import datetime

date1 = datetime.datetime(1990, 4, 4)
delta = datetime.timedelta(days=365)
date2 = date1 + delta

print(type(date2))
print(date2)
<class 'datetime.datetime'>
1991-04-04 00:00:00

Zeitpunkte vergleichen

import datetime

date1 = datetime.datetime(1990, 4, 4)
date2 = datetime.datetime(1991, 4, 4)

print(date1 < date2)
True

Mit Datetime Strings arbeiten

Darüber hinaus kann datetime auch Strings einlesen und exportieren.

String in Datetime umwandeln

import datetime

datum = "1990-04-04"
format = "%Y-%m-%d"
date = datetime.datetime.strptime(datum, format)

print(type(date))
print(date)
<class 'datetime.datetime'>
1990-04-04 00:00:00

Datetime in String umwandeln

import datetime

date = datetime.datetime(1990, 4, 4)
format = "%m/%d/%Y, %H:%M:%S"
string = date.strftime(format)

print(type(string))
print(string)
<class 'str'>
04/04/1990, 00:00:00

Da es unterschiedliche Schreibweisen gibt, kannst du das Format natürlich auch anpassen. Hier die wichtigsten Zeichen:

Direktive Bedeutung Beispiel
%A Wochentag als Text * Sonntag, Montag, …, Samstag
%w Wochentag als zahl. Sonntag ist 0 … Samstag ist 6 0, 1, …, 6
%d Tag des Monats als Zahl (mit 2 Stellen) 01, 02, …, 31
%B Monat als Text * Januar, Februar, …, Dezember
%m Monat als Zahl mit (2 Stellen) 01, 02 …, 12
%Y Jahr (4 Stellen) 0001, 0002, …, 2013, 2014, …, 9998, 9999
%H Stunde (24 H, 2 Stellen) 00, 01, …, 23
%I Stunde (12 H, 2 Stellen) 01, 02, …, 12
%p Vormittag oder Nachmittag * am, pm
%M Minute in Stunde (2 Stellen) 00, 01, …, 59
%S Sekunde in Minute (2 Stellen) 00, 01, …, 59
%z Zeitzone als Offset (±HHMM[SS[.ffffff]]) (empty), +0000, -0400, +1030, +063415, -030712.345216
%Z Zeitzone als Text (empty), UTC, GMT
%c Darstelling der in lokalen Format * Di 16 Aug 21:30:00 1988
%% Tatsächliches Prozentzeichen (escaped) %

* = Je nach Sprache bzw. locale settings


Konnte ich helfen? Ich freue mich über einen Drink! 💙