# 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. ![Magischer Arbeitsbereich eines Uhrmachers](/media/editor_temp/6/5843a4cb-f3a6-4d8d-9a13-89c1cbb0ef6c.png) 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`? {#sec-5f3cbdfb3d40} `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 {#sec-80466bd4f739} ### 2.1 naive / aware – was bedeutet das? {#sec-893b0793d467} `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 {#sec-f876fdec8f2b} Die Speicherung und Berechnung in UTC vereinfacht viele Fälle. ```python from datetime import datetime, timezone utc_now = datetime.now(timezone.utc) # aware (UTC) print(utc_now) ``` Lokale Zeit wird erst bei der Anzeige konvertiert. ```python 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 {#sec-5497d843fd3e} ### 3.1 Addieren/ Subtrahieren {#sec-0288780aa297} ```python 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 {#sec-c781f333910b} ```python 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 {#sec-c81173d2a4f5} `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` {#sec-a17a8e259a48} ### 4.1 datetime → String (`strftime`) {#sec-8d6f34025b2e} ```python 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`) {#sec-f2bbc1672485} ```python 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. ```python 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 man `astimezone()` (siehe nächste Sektion). --- ## 5. Zeitzonen: `timezone` vs. `zoneinfo` {#sec-05b1d0f7ef82} ### 5.1 Feste Offsets – `timezone` {#sec-67fec65074ab} Beispiel: UTC, UTC+9 ```python 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` {#sec-834b663bce83} Für Sommerzeit‑Änderungen ist `zoneinfo` geeignet. ```python 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 {#sec-35bf0fbaa9df} * `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 {#sec-552ca3933648} ### 6.1 naive/aware vermischen {#sec-21a4c96b9022} * 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 {#sec-e2bd08b413c3} `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 {#sec-e52b753858ac} `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 {#sec-b244af674a6a} ### 7.1 ISO 8601 speichern {#sec-4b1979b29466} ```python 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“ {#sec-ae13a5dac423} ```python 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 {#sec-b509d1188ff7} ```python 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 {#sec-9fa53305f95a} `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 Zeitzonen richtig nutzen](/ko/whitedec/2025/11/10/django-datetime-timezone/) - [Django‑Zeitmanagement‑Magie – Vollständiger Leitfaden zu `django.utils.timezone`](/ko/whitedec/2025/11/14/django-utils-timezone-guide/) --- **Frühere Serien ansehen** - [[Python Standardbibliothek – 0] Was ist die Python Standardbibliothek? Ein Leitfaden für Anfänger](/ko/whitedec/2026/1/29/python-standard-library/) - [[Python Standardbibliothek – 1] Dateisystem & OS‑Umgebung meistern: pathlib vs. os](/ko/whitedec/2026/1/29/file-system-os-environment-master-pathlib-vs-os/) - [[Python Standardbibliothek – 2] Daten speichern & serialisieren: json, pickle, csv](/ko/whitedec/2026/1/30/python-json-pickle-csv/)