17 Datum und Zeit 

In diesem Kapitel werden Sie die Python-Module kennenlernen, mit deren Hilfe Sie mit Zeit- und Datumsangaben arbeiten können. Python stellt dafür zwei Module zur Verfügung: time und datetime.
Das Modul time orientiert sich an den Funktionen, die von der zugrunde liegenden C‐Bibliothek implementiert werden, während datetime eine objektorientierte Schnittstelle für die Arbeit mit Zeitpunkten und Zeitspannen zur Verfügung stellt.
Wir werden uns im Folgenden beide Module und ihre Funktionen genauer anschauen. Um die Module time und datetime verwenden zu können, müssen sie zunächst eingebunden werden:
>>> import time
>>> import datetime
17.1 Elementare Zeitfunktionen – time 

Bevor wir uns mit den Funktionen des time-Moduls beschäftigen, werden wir einige Begriffe einführen, die für das Verständnis, wie Zeitangaben verwaltet werden, erforderlich sind.
Das time-Modul setzt direkt auf den Zeitfunktionen der C-Bibliothek des Betriebssystems auf und speichert deshalb alle Zeitangaben als Unix-Timestamps. Ein Unix-Timestamp beschreibt einen Zeitpunkt durch die Anzahl der Sekunden, die seit dem 01.01.1970 um 00:00 Uhr[ 60 ](Mit dem 01.01.1970 um 00:00 Uhr ist der Beginn der sogenannten Unix-Epoche datiert. Sie wurde zur einheitlichen Beschreibung von Zeiten eingeführt. ) vergangen sind.
Beispielsweise markiert der Unix-Timestamp mit dem Wert 1190132696.0 den 18.09.2007 um 18:24 Uhr und 56 Sekunden, da seit dem Beginn der Unix-Epoche bis zu diesem Zeitpunkt genau 1.190.132.696,0 Sekunden vergangen sind.
Beim Umgang mit Zeitstempeln muss man zwei verschiedene Angaben unterscheiden: die Lokalzeit und die koordinierte Weltzeit.
Die Lokalzeit ist abhängig vom Standort der jeweiligen Uhr und bezieht sich auf das, was die Uhren an diesem Standort anzeigen müssen, um richtig zu gehen. Als koordinierte Weltzeit wird die Lokalzeit auf dem Null-Meridian verstanden, der unter anderem durch Großbritannien verläuft. Die koordinierte Weltzeit wird mit UTC für Coordinated Universal Time abgekürzt.[ 61 ](Nein, die Abkürzung UTC für Coordinated Universal Time ist nicht fehlerhaft, sondern rührt daher, dass man einen Kompromiss zwischen der englischen Variante »Coordinated Universal Time« und der französischen Bezeichnung »Temps Universel Coordonné« finden wollte. ) Alle Lokalzeiten lassen sich relativ zur UTC angeben, indem man die Abweichung in Stunden nennt. Beispielsweise hat Mitteleuropa die Lokalzeit UTC + 1, was bedeutet, dass unsere Uhren im Vergleich zu denen in Großbritannien um eine Stunde vorgehen.
Die tatsächliche Lokalzeit wird noch von einem weiteren Faktor beeinflusst, der Sommer- bzw. Winterzeit. Diese auch mit DST für Daylight Saving Time (dt. »Sommerzeit«) abgekürzte Verschiebung ist von den gesetzlichen Regelungen der jeweiligen Region abhängig und hat in der Regel je nach Jahreszeit einen anderen Wert. Das time-Modul findet für den Programmierer heraus, welcher DST-Wert auf der gerade benutzten Plattform am aktuellen Standort der richtige ist, sodass wir uns darum nicht zu kümmern brauchen.
Neben der schon angesprochenen Zeitdarstellung durch Unix-Timestamps gibt es eine weitere Darstellung von Zeiten durch den Datentyp struct_time. Die Instanzen des Typs struct_time haben neun Attribute, die wahlweise über einen Index oder ihren Namen angesprochen werden können. Tabelle 17.1 zeigt den genauen Aufbau des Datentyps.
Tabelle 17.1 Aufbau des Datentyps struct_time
Allen Funktionen, die struct_time-Instanzen als Parameter erwarten, können Sie alternativ auch ein Tupel mit neun Elementen übergeben, das für die entsprechenden Indizes die gewünschten Werte enthält.
Nun gehen wir zur Besprechung der Modulfunktionen und -attribute über.
17.1.1 Attribute 

Das Modul time beinhaltet folgende Attribute:
Attribut | Beschreibung |
---|---|
altzone | Verschiebung der Lokalzeit inklusive Sommerzeit gegenüber der koordinierten Weltzeit in Sekunden |
daylight | Gibt an, ob es in der lokalen Zeitzone eine Sommerzeit gibt. |
struct_time | Referenz auf den Datentyp zur Speicherung von Zeiten |
timezone | Verschiebung der Lokalzeit exklusive Sommerzeit gegenüber der koordinierten Weltzeit in Sekunden |
tzname | Beschreibung der Zeitzone |
Tabelle 17.2 Attribute des Moduls time
altzone
Dieses Attribut speichert die Verschiebung der Lokalzeit von der UTC in Sekunden, wobei eine eventuell vorhandene Sommerzeit auch berücksichtigt wird. Liegt die aktuelle Zeitzone östlich vom Null-Meridian, ist der Wert von altzone positiv; liegt die lokale Zeitzone westlich davon, ist er negativ.
Dieses Attribut sollte nur dann benutzt werden, wenn daylight nicht den Wert 0 hat.
daylight
Dieses Attribut hat einen Wert, der von 0 verschieden ist, wenn es in der lokalen Zeitzone eine Sommerzeit gibt. Ist für den lokalen Standort keine Sommerzeit definiert, hat daylight den Wert 0. Die durch die Sommerzeit entstehende Verschiebung lässt sich mit altzone ermitteln.
struct_time
Dies ist eine Referenz auf den eingangs besprochenen Datentyp struct_time.
Sie können mit struct_time direkt Instanzen dieses Typs erzeugen, indem Sie dem Konstruktor eine Sequenz mit neun Elementen übergeben:
>>> t = time.struct_time((2007, 9, 18, 18, 24, 56, 0, 0, 0))
>>> t.tm_year
2007
timezone
Dieses Attribut speichert die Verschiebung der Lokalzeit relativ zur UTC in Sekunden, wobei eine eventuell vorhandene Sommerzeit nicht berücksichtigt wird.
tzname
Dieses Attribut enthält ein Tupel mit zwei Strings. Der erste String ist der Name der lokalen Zeitzone und der zweite der der lokalen Zeitzone mit Sommerzeit. Wenn die Lokalzeit keine Sommerzeit kennt, sollten Sie das zweite Element des Tupels nicht verwenden.
>>> time.tzname
('Mitteleuropäische Zeit', 'Mitteleuropäische Sommerzeit')
17.1.2 Funktionen 

Einen Überblick über die Funktionen des Moduls time gibt Ihnen Tabelle 17.3.
Funktion | Beschreibung |
---|---|
asctime([t]) | Konvertiert die übergebene struct_time-Instanz in einen String. |
perf_counter() | Liefert Zeitpunkte, die sich zur Performance-Messung von Programmen eignen. |
ctime([secs]) | Konvertiert den übergebenen Unix-Zeitstempel in einen String. Falls kein Zeitstempel übergeben wurde, wird die aktuelle Systemzeit verwendet. |
gmtime([secs]) | Wandelt einen Unix-Timestamp in eine struc_time-Instanz um. Dabei wird die koordinierte Weltzeit zugrunde gelegt. |
localtime([secs]) | Wandelt einen Unix-Timestamp in eine struc_time-Instanz um. Dabei wird die Lokalzeit zugrunde gelegt. |
mktime(t) | Wandelt eine struct_time-Instanz in einen Unix-Timestamp um. Dabei wird die Lokalzeit zugrunde gelegt. |
sleep(secs) | Unterbricht den Programmablauf. |
strftime(format, [t]) | Wandelt eine struct_time-Instanz nach den übergebenen Regeln in einen String um. |
strptime(string, [format]) | Interpretiert einen String nach den übergebenen Regeln als Zeitangabe und liefert eine passende struct_time-Instanz. |
time() | Gibt den aktuellen Unix-Zeitstempel zurück. Dabei wird die koordinierte Weltzeit zugrunde gelegt. |
Tabelle 17.3 Funktionen des Moduls time
asctime([t])
Diese Funktion wandelt eine struct_time-Instanz oder ein Tupel mit neun Elementen in einen String um. Die Form des resultierenden Strings zeigt das folgende Beispiel:
>>> time.asctime((1987, 7, 26, 10, 40, 0, 0, 0, 0))
'Mon Jul 26 10:40:00 1987'
Wird der optionale Parameter t nicht übergeben, gibt asctime einen String für die aktuelle Systemzeit zurück.
Die Funktion ctime leistet das Gleiche wie asctime, nur für Unix-Timestamps.
[»] Hinweis
Die Funktion asctime liefert immer einen String zurück, der aus 24 Zeichen besteht und so formatiert ist, wie im Beispiel gezeigt.
Wenn Sie mehr Kontrolle über das Aussehen des resultierenden Strings wünschen, ist die Methode strftime besser geeignet.
perf_counter()
Diese Funktion gibt einen Zeitzähler zurück, der sich gut für die Messung von Laufzeiten innerhalb von Programmen eignet. Dabei wird auf die Uhr mit der höchsten Auflösung zurückgegriffen, die das Betriebssystem zur Verfügung stellt.
>>> start = time.perf_counter()
>>> rechenintensive_funktion()
>>> ende = time.perf_counter()
>>> print("Die Funktion lief "
... "{:1.2f} Sekunden".format(ende - start))
Die Funktion lief 7.46 Sekunden
gmtime([secs])
Diese Funktion wandelt einen Unix-Timestamp in ein struct_time-Objekt um. Dabei wird immer die koordinierte Weltzeit benutzt, und das tm_isdst-Attribut des resultierenden Objekts hat immer den Wert 0.
Wird der Parameter secs nicht übergeben oder hat er den Wert None, wird der aktuelle Zeitstempel benutzt, wie er von der Funktion time zurückgegeben wird.
>>> time.gmtime()
time.struct_time(tm_year=2017, tm_mon=1, tm_mday=18, tm_hour=16, tm_min=11, tm_sec=45, tm_wday=6, tm_yday=18, tm_isdst=0)
Das Beispiel oben wurde also nach UTC am 18.01.2017 um 16:11 Uhr ausgeführt.
localtime([secs])
Genau wie gmtime, jedoch wandelt diese Funktion den übergebenen Timestamp in eine Angabe der lokalen Zeitzone um.
mktime(t)
Diese Funktion wandelt eine struct_time-Instanz in einen Unix-Timestamp der Lokalzeit um. Der Rückgabewert ist eine Gleitkommazahl.
Die Funktionen localtime und mktime sind jeweils Umkehrfunktionen voneinander:
>>> t1 = time.localtime()
>>> t2 = time.localtime(time.mktime(t1))
>>> t1 == t2
True
sleep(secs)
Die Funktion sleep unterbricht die Programmausführung für die übergebene Zeitspanne. Der Parameter secs muss dabei eine Gleitkommazahl sein, die die Dauer der Unterbrechung in Sekunden angibt.
Wenn Sie ein Programm mittels sleep unterbrechen, befindet es sich im Leerlauf und beansprucht den Prozessor nicht.
strftime(format, [t])
Diese Funktion wandelt die struct_time-Instanz t oder ein neunelementiges Tupel t in einen String um. Dabei wird mit dem ersten Parameter namens format ein String übergeben, der das gewünschte Format des Ausgabe-Strings enthält.
Ähnlich wie der Formatierungsoperator für Strings enthält der Format-String eine Reihe von Platzhaltern, die im Ergebnis durch die entsprechenden Werte ersetzt werden. Jeder Platzhalter besteht aus einem Prozentzeichen und einem Identifikationsbuchstaben. Tabelle 17.4 zeigt alle unterstützten Platzhalter.
Zeichen | Bedeutung |
---|---|
%a | lokale Abkürzung für den Namen des Wochentages |
%A | der komplette Name des Wochentages in der lokalen Sprache |
%b | lokale Abkürzung für den Namen des Monats |
%B | der vollständige Name des Monats in der lokalen Sprache |
%c | das Format für eine angemessene Datums- und Zeitdarstellung auf der lokalen Plattform |
%d | Nummer des Tages im aktuellen Monat. Ergibt einen String der Länge 2 im Bereich [01,31]. |
%H | Stunde im 24-Stunden-Format. Das Ergebnis hat immer zwei Ziffern und liegt im Bereich [00,23]. |
%I | Stunde im 12-Stunden-Format. Das Ergebnis hat immer zwei Ziffern und liegt im Bereich [01,12]. |
%j | Nummer des Tages im Jahr. Das Ergebnis hat immer drei Ziffern und liegt im Bereich [001, 366]. |
%m | Nummer des Monats, bestehend aus zwei Ziffern im Bereich [01,12] |
%M | Minute als Zahl mit zwei Ziffern. Liegt immer im Bereich [00,59]. |
%p | die lokale Entsprechung für AM bzw. PM* |
%S | Sekunde als Zahl mit zwei Ziffern. Liegt immer im Bereich [00,61]. |
%U |
Nummer der aktuellen Woche im Jahr, wobei der Sonntag als erster Tag der Woche betrachtet wird. Das Ergebnis hat immer zwei Ziffern und liegt im Bereich [01,53]. Der Zeitraum am Anfang eines Jahres vor dem ersten Sonntag wird als 0. Woche gewertet. |
%w | Nummer des aktuellen Tages in der Woche. Sonntag wird als 0. Tag betrachtet. Das Ergebnis liegt im Bereich [0,6]. |
%W | wie %U, nur dass anstelle des Sonntags der Montag als 0. Tag der Woche betrachtet wird |
%x | Datumsformat der lokalen Plattform |
%X | Zeitformat der lokalen Plattform |
%y | Jahr ohne Jahrhundertangabe. Das Ergebnis besteht immer aus zwei Ziffern und liegt im Bereich [00,99]. |
%Y | komplette Jahreszahl mit Jahrhundertangabe |
%Z | Name der lokalen Zeitzone oder ein leerer String, wenn keine lokale Zeitzone festgelegt wurde |
%% | Ergibt ein Prozentzeichen % im Resultat-String. |
* von lat. »ante meridiem« (dt. »vor dem Mittag«) bzw. lat. »post meridiem« (»nach dem Mittag«) |
Tabelle 17.4 Übersicht über alle Platzhalter der strftime-Funktion
Mit dem folgenden Ausdruck erzeugen Sie beispielsweise eine Ausgabe des aktuellen Zeitpunktes in einem für Deutschland üblichen Format:
>>> time.strftime("%d.%m.%Y um %H:%M:%S Uhr")
'20.01.2017 um 12:50:41 Uhr'
strptime(string, [format])
Mit strptime wandeln Sie einen Zeit-String wieder in eine time.struct_time-Instanz um. Der Parameter format gibt dabei das Format an, in dem der String die Zeit enthält. Der Aufbau solcher Format-Strings ist der gleiche wie bei strftime.
>>> zeit_string = '19.09.2007 um 00:21:17 Uhr'
>>> time.strptime(zeit_string, "%d.%m.%Y um %H:%M:%S Uhr")
time.struct_time(tm_year=2007, tm_mon=9, tm_mday=19, tm_hour=0, tm_min=21,
tm_sec=17, tm_wday=2, tm_yday=262, tm_isdst=-1)
Geben Sie den optionalen Parameter format nicht an, wird der Standardwert "%a %b %d %H:%M:%S %Y" verwendet. Dies entspricht dem Ausgabeformat von ctime und asctime.
time()
Dies gibt den aktuellen Unix-Zeitstempel in UTC als Gleitkommazahl zurück.
Beachten Sie dabei, dass nicht alle Systeme eine höhere Auflösung als eine Sekunde unterstützen und der Nachkommateil daher nicht unbedingt verlässlich ist.