Zeitmodifikationen – Warum du das Python Modul datetime verwenden solltest

Zeitmodifikationen – Warum du das Python Modul datetime verwenden solltest

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 das 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 andere Zeitzonen bereitstellen kannst. Kein Problem. Einfach 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 Länder wie Israel, wo die Menschen in derselben Stadt unterschiedliche Zeitzonen benutzen. Die Israelis und die Palästinenser wollten sich nicht auf eine einheitliche Regelung einigen.

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.

Es reicht nicht aus eine Zeitzone pro Stunde anzubieten. Manche Länder wie Australien verwenden halbstündige Zeitzonen. Nepal verwendet sogar Viertelstunden. Heißt die Nepal Standard Time ist 5 Stunden und 45 Minuten VOR UTC.

Praktisch müsstest du eine Liste von allen aktuellen Zeitzonen bereitstellen aus denen der 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. Anders als seine Nachbarstaaten.

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 -12 Stunden und +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 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. Hier wurde eine andere Anzahl an Tagen übersprungen. Du müsstest also beim Umrechnen ins andere System auch beachten für welchen Ort du es umrechnen willst.

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. Ein Jahr eigentlich keine 365, sondern 365,25 Tage lang. Durch Einfügung eines extra Tages alle 4 Jahre wird das wieder angepasst. Alle Jahre die durch 4 Teilbar sind, sind Schaltjahre.

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 ändernden Magnetfeldern… Genau weiß man das noch nicht.

Auf jeden Fall entscheidet hierzulande die Physikalisch-Technische Bundesanstalt ob und wann wir eine Schaltsekunde brauchen. Leider kann das anderen Ländern kann das anders sein.

Pythons Datetime Modul

Klar, natürlich kann man alles hier erwähnte in den eigenen Code integrieren.

Aber das muss nicht sein!

Es gibt schon 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.

Datetime Objekte erstellen

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 speichert die differenz zwischen zwei Zeitpunkten.

Zeitinverval berechnen

import datetime

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

print(type(delta))
print(datetime.timedelta(days=-365))
<class 'datetime.timedelta'>
-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

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

Schreibe einen Kommentar