Zeit in Python mit der Standardbibliothek meistern: datetime vollständig verstehen
Serie 03 – Zeitrechnung, Zeitzonen, Formatkonvertierung in einem Rutsch
Zeit ist mehr als nur ein „String“. Tage und Monate vergehen, die Sommerzeit tritt in Kraft und die Zeitzonen variieren je nach Region. Deshalb ist es wichtig, bei der Arbeit mit Datum und Uhrzeit zwischen dem anzeigbaren String und dem für Berechnungen nutzbaren Zeitwert zu unterscheiden und Zeitzonen einzubeziehen.

In diesem Beitrag konzentrieren wir uns auf das datetime-Modul und behandeln:
- Aktuelle Uhrzeit und Datum erzeugen
- Zeiträume berechnen (
timedelta) - Formatieren/Parsen von Strings (
strftime,strptime) - Zeitzonen verarbeiten (
timezone,zoneinfo) - Häufige Fehlerquellen und bewährte Muster
1. Was bietet datetime?
datetime enthält verschiedene Typen, die ähnlich aussehen, aber unterschiedliche Rollen haben.
date: Nur das Datum (Jahr-Monat-Tag)time: Nur die Uhrzeit (Stunde:Minute:Sekunde)datetime: Datum + Uhrzeit (häufigste Verwendung)timedelta: Differenz (Zeitraum)timezone: Feste Offset‑Zeitzone (z. B. UTC+9)
Seit Python 3.9 ist zoneinfo Teil der Standardbibliothek, wodurch die Arbeit mit lokalen Zeitzonen (z. B. Asia/Tokyo) vereinfacht wird.
2. „Jetzt“ holen: naive vs. aware
2.1 naive / aware – was bedeutet das?
datetime‑Objekte lassen sich in zwei Kategorien einteilen.
- naive datetime: Keine Zeitzoneninformation
- aware datetime: Zeitzoneninformation (
tzinfo)
Das Mischen von beiden Typen kann zu Fehlern führen oder unerwartete Ergebnisse liefern.
2.2 Empfohlener Standard: UTC‑aware starten
Die Speicherung und Berechnung in UTC vereinfacht viele Fälle.
from datetime import datetime, timezone
utc_now = datetime.now(timezone.utc) # aware (UTC)
print(utc_now)
Lokale Zeit wird erst bei der Anzeige konvertiert.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc_now = datetime.now(timezone.utc)
tokyo_now = utc_now.astimezone(ZoneInfo("Asia/Tokyo"))
print(utc_now)
print(tokyo_now)
3. Datum/Zeit rechnen: timedelta im Fokus
3.1 Addieren/ Subtrahieren
from datetime import datetime, timedelta, timezone
now = datetime.now(timezone.utc)
print(now + timedelta(days=3))
print(now - timedelta(hours=2))
3.2 Differenz zweier Zeitpunkte
from datetime import datetime, timezone
a = datetime(2026, 1, 1, tzinfo=timezone.utc)
b = datetime(2026, 1, 10, tzinfo=timezone.utc)
delta = b - a
print(delta.days) # 9
print(delta.total_seconds()) # 777600.0
3.3 timedelta für „Zeitraum“ – ein Gefühl entwickeln
timedelta arbeitet in Tagen, Sekunden und Mikrosekunden. Ein Ausdruck wie „in einem Monat“ lässt sich mit timedelta(days=30) grob abbilden, aber für den nächsten gleichen Kalendertag ist ein anderer Ansatz erforderlich (häufig wird dafür dateutil außerhalb der Standardbibliothek verwendet).
4. Formatieren und Parsen: strftime / strptime
4.1 datetime → String (strftime)
from datetime import datetime, timezone
dt = datetime(2026, 1, 30, 14, 5, 0, tzinfo=timezone.utc)
print(dt.strftime("%Y-%m-%d %H:%M:%S %z"))
Häufig verwendete Format‑Platzhalter:
%Y-%m-%d: 2026-01-30%H:%M:%S: 14:05:00%z: +0000 (UTC‑Offset)
4.2 String → datetime (strptime)
from datetime import datetime
s = "2026-01-30 14:05:00"
dt = datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
print(dt)
Das erzeugte dt ist naive. Für eine Zeitzone muss tzinfo zugewiesen werden.
from datetime import datetime, timezone
s = "2026-01-30 14:05:00"
dt = datetime.strptime(s, "%Y-%m-%d %H:%M:%S").replace(tzinfo=timezone.utc)
print(dt)
replace(tzinfo=…)ändert nicht den Zeitwert, sondern fügt lediglich die Zeitzoneninformation hinzu. Für eine echte Umrechnung nutzt manastimezone()(siehe nächste Sektion).
5. Zeitzonen: timezone vs. zoneinfo
5.1 Feste Offsets – timezone
Beispiel: UTC, UTC+9
from datetime import datetime, timezone, timedelta
kst_fixed = timezone(timedelta(hours=9))
dt = datetime(2026, 1, 30, 12, 0, tzinfo=kst_fixed)
print(dt)
5.2 Lokale Zeitzonen – zoneinfo
Für Sommerzeit‑Änderungen ist zoneinfo geeignet.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc_now = datetime.now(timezone.utc)
ny_now = utc_now.astimezone(ZoneInfo("America/New_York"))
print(ny_now)
5.3 replace(tzinfo=…) vs. astimezone(...) – Unterschied
replace(tzinfo=…): Der Zeitwert bleibt gleich, die Zeitzoneninformation wird nur zugewiesen.astimezone(...): Der gleiche Moment wird in die Ziel‑Zeitzone umgerechnet.
Das Verständnis dieser Unterschiede reduziert Zeitzonen‑Fehler erheblich.
6. Häufige Stolperfallen
6.1 naive/aware vermischen
- Interne Berechnungen sollten aware (UTC) sein.
- Eingehende Daten sollten sofort mit Zeitzone versehen und normalisiert werden.
6.2 „Lokale Zeit“ kann je nach Umgebung variieren
datetime.now() folgt der lokalen Einstellung der Ausführungsumgebung. In Containern oder Servern kann die lokale Zeit UTC sein. Verwenden Sie datetime.now(timezone.utc) für Konsistenz.
6.3 Format‑Mismatch beim Parsen
strptime schlägt fehl, wenn das Format nicht exakt übereinstimmt. Bei mehreren möglichen Eingabeformaten empfiehlt sich eine Vorverarbeitung oder schrittweise Formatversuche.
7. Drei häufige Muster
7.1 ISO 8601 speichern
from datetime import datetime, timezone
dt = datetime.now(timezone.utc)
print(dt.isoformat()) # z. B.: 2026-01-30T05:12:34.567890+00:00
7.2 Dateiname mit „heute“
from datetime import datetime
stamp = datetime.now().strftime("%Y%m%d")
filename = f"report_{stamp}.json"
print(filename)
7.3 Restzeit bis zu einem Zielzeitpunkt
from datetime import datetime, timezone
target = datetime(2026, 2, 1, 0, 0, tzinfo=timezone.utc)
now = datetime.now(timezone.utc)
remaining = target - now
print(remaining)
print(remaining.total_seconds())
8. Fazit
datetime geht über das Erzeugen von Datums-Strings hinaus und ermöglicht die Arbeit mit Zeit als für Berechnungen nutzbarem Wert. Mit Zeitzonen (timezone, zoneinfo) wird der Code robuster gegenüber unterschiedlichen Ausführungsumgebungen.
Im nächsten Beitrag werden wir random separat behandeln: Zufallszahlen, Sampling, Shuffling, Seeds und sichere Zufallszahlen (secrets).
Verwandte Artikel:
- Django: datetime und timezone richtig verwenden
- Das Zeitmanagement-Magie von Django - Perfekte Anleitung zu 'django.utils.timezone'
Frühere Serien ansehen
Es sind keine Kommentare vorhanden.