Python strftime und strptime richtig verwenden

Python bietet mit strftime() und strptime() aus der datetime Standardbibliothek zwei nützliche Funktionen um mit Zeit-Strings arbeiten zu können, schauen wir uns an, wie wir sie richtig verwenden.

Mit strftime() Zeit-Strings erstellen

Mit Hilfe der strftime() Funktion (merke: string from time) erstellt man aus date, datetime und time Objekten einfache Strings. Dazu benötigt es nur einen sogenannten Format-String, der beschreibt, was in dem Zeit String enthalten sein soll. Damit erstellt man dann beliebige Strings, die z.B. in einer grafischen Oberfläche angezeigt werden können.

In einem einfachen Beispiel erzeugen wir zunächst ein datetime Objekt, also ein Objekt, das sowohl ein Datum als auch eine Uhrzeit enthält. Mit der strftime() Funktion und unterschiedlichen Format String erstellen wir dann verschiedene Strings, z.B. um für Menschen unterschiedlicher Herkunft ihre gewohnte Schreibweise zu erzeugen.

german_date_format = "%d.%m.%Y"
us_date_format = "%Y-%m-%d"
time_obj = datetime.datetime.now()
print(time_obj)
print(time_obj.strftime(german_date_format))
print(time_obj.strftime(us_date_format))

Python gibt uns anschließend folgendes aus:

2021-10-15 12:34:56.750116
15.10.2021
2021-10-15

Format-String Codes richtig verwenden

Die Codes des Format-Strings bestimmen also, wie das Ergbnis letztlich aussieht. Diese sind frei kombinierbar. Da im datetime Objekt auch eine Uhrzeit hinterlegt ist, können wir demnach auch die Zeit in einem für uns passenden Format einfügen. Die Codes %H, %M und %S repräsentieren dabei Stunden, Minuten und Sekunden. Der Doppelpunkt im Format-String wird genau so in den Ausgabe-String übernommen.

german_date_format = "%d.%m.%Y %H:%M:%S" 
time_obj = datetime.datetime.now()
print(time_obj)
print(time_obj.strftime(german_date_format))
2021-10-15 12:34:56.750116
15.10.2021 12:34:56

Zeit-Strings mit strptime() einlesen

Umgekehrt erzeugen wir aus einem String, der ein Datum und/oder eine Uhrzeit enthält mit der strptime() Funktion (merke: string parse time) und einem Format-String ein datetime Objekt.

Erstellen wir also aus diesem Zeit-String „Di 12. Okt 1999, 13 Uhr“, den unsere Anwendung vielleicht von einem anderen Programm übermittelt bekommen hat ein „standartisiertes“ datetime Objekt. Wir müssen dazu aber wissen, welche „Sprache“ benutzt wird, daher setzen wir die nötige locale Variable auf „Deutsch“. Andernfalls wird %a vielleicht nicht korrekt gelesen.

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
specific_date_string = "Di 12. Okt 1999, 13 Uhr"
specific_format_string = "%a %d. %b %Y, %H Uhr"
parsed_time_obj = datetime.datetime.strptime(specific_date_string, specific_format_string)
print(parsed_time_obj)
1999-10-12 13:00:00

Am besten isoformat benutzen

Wann immer es möglich, sollten das isoformat bei Zeitstempeln benutzt werden. Dieses Format ist klar definiert und kann in jeder Programmiersprache gelesen werden. Der Transportweg über Strings ist damit einfach möglich.

Wenn wir unser Beispiel oben erweitern, so möchten wir aus dem Zeit-String der externen (möglicherweise in die Jahre gekommenen) Anwendung im Idealfall einen Isoformat-String mit Zeitzone erzeugen, um diesen an moderne Software problemlos weiterleiten zu können.

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
specific_date_string = "Di 12. Okt 1999, 13 Uhr"
specific_format_string = "%a %d. %b %Y, %H Uhr"
parsed_time_obj = datetime.datetime.strptime(specific_date_string, specific_format_string)
print(parsed_time_obj)
print(parsed_time_obj.isoformat())
parsed_time_obj_tz = parsed_time_obj.replace(tzinfo=timezone.utc)
print(parsed_time_obj_tz.isoformat())
1999-10-12 13:00:00
1999-10-12T13:00:00
1999-10-12T13:00:00+00:00

Die Methode fromisoformat() benutzen wir immer dann, wenn wir einen entsprechenden Iso-Zeit-String einlesen wollen, ganz ohne Format-String.

print(datetime.datetime.fromisoformat("1999-10-12T12:35:56+00:00"))
1999-10-12 12:34:45+00:00

tl;dr

Python bietet die Möglichkeit mit strftime und strptime Zeit-Strings zu erzeugen und einzulesen. Idealerweise möchte man aber immer isoformat benutzen.