Python Datetime: Vollständiger Leitfaden zu Datum und Zeit in Python
Updated on
Die Arbeit mit Datum und Zeit in Python sollte unkompliziert sein, ist es aber selten. Sie müssen einen Datumsstring aus einer CSV-Datei parsen, aber "01/02/2026" könnte je nach Gebietsschema den 2. Januar oder den 1. Februar bedeuten. Sie möchten die Differenz zwischen zwei Zeitstempeln berechnen, aber einer ist ein String und der andere eine Unix-Epoche. Sie verwechseln strftime und strptime zum zehnten Mal in diesem Monat. Datums- und Zeitoperationen sind eine ständige Quelle von Bugs, Off-by-one-Fehlern und Zeitzonen-Kopfschmerzen in Produktionscode.
Die Konsequenzen gehen über bloße Unannehmlichkeiten hinaus. Ein falsches Datumsformat in einem Finanzbericht bedeutet fehlerhafte Berechnungen. Ein naiver Datetime-Vergleich, der Zeitzonen ignoriert, verursacht doppelte Cron-Jobs. Eine fehlerhafte timedelta-Berechnung berechnet einem Kunden 31 Tage statt 30.
Pythons eingebautes datetime-Modul löst diese Probleme mit einer sauberen, konsistenten API. Es bietet Klassen für Daten, Zeiten, Zeitstempel und Zeitspannen. Sobald Sie die Muster gelernt haben -- und insbesondere den Unterschied zwischen strftime und strptime -- können Sie jede Datumsoperation ohne Drittanbieter-Bibliotheken bewältigen.
Aktuelles Datum und aktuelle Zeit abrufen
Der häufigste Ausgangspunkt ist das Abrufen des aktuellen Datums und der aktuellen Zeit. Das datetime-Modul bietet verschiedene Möglichkeiten dafür.
from datetime import datetime, date
# Aktuelles Datum und aktuelle Zeit
now = datetime.now()
print(now) # 2026-02-10 14:30:45.123456
# Nur aktuelles Datum
today = date.today()
print(today) # 2026-02-10
# datetime.today() ist ähnlich wie datetime.now() aber ohne Zeitzonenunterstützung
now_alt = datetime.today()
print(now_alt) # 2026-02-10 14:30:45.123456Der Unterschied zwischen datetime.now() und datetime.today() ist subtil, aber wichtig. datetime.now() akzeptiert einen optionalen tz-Parameter für zeitzonenbewusste Datetimes. datetime.today() nicht. Für die meisten Programme bevorzugen Sie datetime.now().
from datetime import datetime
from zoneinfo import ZoneInfo
# Zeitzonenbewusste aktuelle Zeit
utc_now = datetime.now(tz=ZoneInfo("UTC"))
print(utc_now) # 2026-02-10 14:30:45.123456+00:00
tokyo_now = datetime.now(tz=ZoneInfo("Asia/Tokyo"))
print(tokyo_now) # 2026-02-10 23:30:45.123456+09:00Datetime-Objekte erstellen
Sie können Datetime-Objekte aus einzelnen Komponenten oder aus vorhandenen Daten erstellen.
from datetime import datetime, date, time
# Aus Jahr, Monat, Tag, Stunde, Minute, Sekunde
dt = datetime(2026, 3, 15, 9, 30, 0)
print(dt) # 2026-03-15 09:30:00
# Nur Datum
d = date(2026, 12, 25)
print(d) # 2026-12-25
# Nur Zeit
t = time(14, 30, 0)
print(t) # 14:30:00
# Datum und Zeit kombinieren
combined = datetime.combine(d, t)
print(combined) # 2026-12-25 14:30:00Sie können auch Komponenten aus einem vorhandenen Datetime extrahieren.
from datetime import datetime
dt = datetime(2026, 3, 15, 9, 30, 45)
print(dt.year) # 2026
print(dt.month) # 3
print(dt.day) # 15
print(dt.hour) # 9
print(dt.minute) # 30
print(dt.second) # 45
print(dt.weekday()) # 6 (Sonntag, Montag=0)
print(dt.isoformat()) # 2026-03-15T09:30:45Daten formatieren mit strftime
strftime steht für "string format time" (String aus Zeit formatieren). Es wandelt ein Datetime-Objekt in einen formatierten String um. Sie übergeben einen Formatstring mit Direktiven, die durch Datumskomponenten ersetzt werden.
from datetime import datetime
dt = datetime(2026, 3, 15, 9, 5, 7)
# Gängige Formate
print(dt.strftime("%Y-%m-%d")) # 2026-03-15
print(dt.strftime("%d/%m/%Y")) # 15/03/2026
print(dt.strftime("%B %d, %Y")) # March 15, 2026
print(dt.strftime("%Y-%m-%d %H:%M:%S")) # 2026-03-15 09:05:07
print(dt.strftime("%I:%M %p")) # 09:05 AM
print(dt.strftime("%A, %B %d, %Y")) # Sunday, March 15, 2026Hier eine einfache Eselsbrücke: strftime = string from time (Datetime zu String).
strftime-Formatcodes Referenz
| Code | Bedeutung | Beispiel |
|---|---|---|
%Y | 4-stelliges Jahr | 2026 |
%y | 2-stelliges Jahr | 26 |
%m | Monat als nullgepolsterte Zahl | 03 |
%B | Vollständiger Monatsname | March |
%b | Abgekürzter Monatsname | Mar |
%d | Tag des Monats (nullgepolstert) | 15 |
%A | Vollständiger Wochentagsname | Sunday |
%a | Abgekürzter Wochentagsname | Sun |
%H | Stunde (24-Stunden, nullgepolstert) | 09 |
%I | Stunde (12-Stunden, nullgepolstert) | 09 |
%M | Minute (nullgepolstert) | 05 |
%S | Sekunde (nullgepolstert) | 07 |
%p | AM/PM | AM |
%f | Mikrosekunde (nullgepolstert auf 6 Stellen) | 000000 |
%z | UTC-Offset (+HHMM oder -HHMM) | +0000 |
%Z | Zeitzonenname | UTC |
%j | Tag des Jahres (001-366) | 074 |
%% | Literales %-Zeichen | % |
Häufig verwendete Formatmuster
| Muster | Formatstring | Ausgabe |
|---|---|---|
| ISO 8601 | %Y-%m-%dT%H:%M:%S | 2026-03-15T09:05:07 |
| US-Datum | %m/%d/%Y | 03/15/2026 |
| Europäisches Datum | %d/%m/%Y | 15/03/2026 |
| Lesbares Datum | %B %d, %Y | March 15, 2026 |
| Log-Zeitstempel | %Y-%m-%d %H:%M:%S | 2026-03-15 09:05:07 |
| 12-Stunden-Zeit | %I:%M:%S %p | 09:05:07 AM |
| Kompaktes Datum | %Y%m%d | 20260315 |
| Dateisicherer Zeitstempel | %Y%m%d_%H%M%S | 20260315_090507 |
Strings parsen mit strptime
strptime steht für "string parse time" (String in Zeit parsen). Es ist die Umkehrung von strftime -- es wandelt einen String in ein Datetime-Objekt um. Sie geben den String und das zugehörige Format an.
from datetime import datetime
# Verschiedene Datumsstring-Formate parsen
dt1 = datetime.strptime("2026-03-15", "%Y-%m-%d")
print(dt1) # 2026-03-15 00:00:00
dt2 = datetime.strptime("15/03/2026", "%d/%m/%Y")
print(dt2) # 2026-03-15 00:00:00
dt3 = datetime.strptime("March 15, 2026 09:30 AM", "%B %d, %Y %I:%M %p")
print(dt3) # 2026-03-15 09:30:00
dt4 = datetime.strptime("2026-03-15T09:30:00", "%Y-%m-%dT%H:%M:%S")
print(dt4) # 2026-03-15 09:30:00Merken Sie sich: strptime = string parse time (String zu Datetime).
Parse-Fehler behandeln
Wenn der String nicht dem Format entspricht, löst Python einen ValueError aus. Wickeln Sie strptime-Aufrufe immer in Fehlerbehandlung ein, wenn Sie Benutzereingaben oder externe Daten parsen.
from datetime import datetime
def safe_parse_date(date_string, fmt="%Y-%m-%d"):
"""Parse a date string safely, returning None on failure."""
try:
return datetime.strptime(date_string, fmt)
except ValueError as e:
print(f"Could not parse '{date_string}': {e}")
return None
# Valid input
print(safe_parse_date("2026-03-15")) # 2026-03-15 00:00:00
# Invalid input
print(safe_parse_date("15-03-2026")) # Could not parse '15-03-2026': ...
print(safe_parse_date("not a date")) # Could not parse 'not a date': ...Mehrere Formate parsen
Wenn Sie Daten in unvorhersehbaren Formaten erhalten, probieren Sie mehrere Muster aus.
from datetime import datetime
def parse_flexible_date(date_string):
"""Try multiple date formats and return the first match."""
formats = [
"%Y-%m-%d",
"%d/%m/%Y",
"%m/%d/%Y",
"%B %d, %Y",
"%b %d, %Y",
"%Y-%m-%dT%H:%M:%S",
"%Y-%m-%d %H:%M:%S",
]
for fmt in formats:
try:
return datetime.strptime(date_string, fmt)
except ValueError:
continue
raise ValueError(f"No matching format found for '{date_string}'")
print(parse_flexible_date("2026-03-15")) # 2026-03-15 00:00:00
print(parse_flexible_date("March 15, 2026")) # 2026-03-15 00:00:00
print(parse_flexible_date("15/03/2026")) # 2026-03-15 00:00:00Datumsarithmetik mit timedelta
Die Klasse timedelta repräsentiert eine Zeitspanne -- die Differenz zwischen zwei Daten oder Zeiten. Sie können timedelta-Objekte addieren oder subtrahieren, um Daten vor- oder zurückzuverschieben.
from datetime import datetime, timedelta
now = datetime(2026, 2, 10, 12, 0, 0)
# Tage addieren
tomorrow = now + timedelta(days=1)
print(tomorrow) # 2026-02-11 12:00:00
# Tage subtrahieren
last_week = now - timedelta(weeks=1)
print(last_week) # 2026-02-03 12:00:00
# Stunden und Minuten addieren
later = now + timedelta(hours=5, minutes=30)
print(later) # 2026-02-10 17:30:00
# Mehrere Einheiten kombinieren
future = now + timedelta(weeks=2, days=3, hours=6)
print(future) # 2026-02-27 18:00:00Zeitdifferenzen berechnen
Das Subtrahieren eines Datetimes von einem anderen ergibt ein timedelta.
from datetime import datetime
start = datetime(2026, 1, 1)
end = datetime(2026, 12, 31)
diff = end - start
print(diff) # 364 days, 0:00:00
print(diff.days) # 364
print(diff.total_seconds()) # 31449600.0timedelta-Konstruktorparameter
| Parameter | Beschreibung | Beispiel |
|---|---|---|
weeks | Anzahl der Wochen | timedelta(weeks=2) = 14 Tage |
days | Anzahl der Tage | timedelta(days=30) |
hours | Anzahl der Stunden | timedelta(hours=12) |
minutes | Anzahl der Minuten | timedelta(minutes=45) |
seconds | Anzahl der Sekunden | timedelta(seconds=120) |
milliseconds | Anzahl der Millisekunden | timedelta(milliseconds=500) |
microseconds | Anzahl der Mikrosekunden | timedelta(microseconds=1000) |
Alle Parameter können kombiniert werden. Intern speichert timedelta nur days, seconds und microseconds. Alles andere wird umgerechnet.
from datetime import timedelta
delta = timedelta(weeks=1, days=2, hours=3, minutes=30, seconds=45)
print(delta) # 9 days, 3:30:45
print(delta.days) # 9
print(delta.seconds) # 12645 (3*3600 + 30*60 + 45)
print(delta.total_seconds()) # 790245.0Daten vergleichen
Datetime-Objekte unterstützen alle Standard-Vergleichsoperatoren. Das macht das Sortieren und Filtern von Daten unkompliziert.
from datetime import datetime
dt1 = datetime(2026, 1, 1)
dt2 = datetime(2026, 6, 15)
dt3 = datetime(2026, 12, 31)
print(dt1 < dt2) # True
print(dt3 > dt2) # True
print(dt1 == dt2) # False
print(dt1 != dt2) # TrueDaten sortieren
from datetime import datetime
dates = [
datetime(2026, 12, 25),
datetime(2026, 1, 1),
datetime(2026, 7, 4),
datetime(2026, 2, 14),
]
sorted_dates = sorted(dates)
for d in sorted_dates:
print(d.strftime("%B %d, %Y"))
# January 01, 2026
# February 14, 2026
# July 04, 2026
# December 25, 2026Mit Zeitstempeln arbeiten
Unix-Zeitstempel repräsentieren Sekunden seit dem 1. Januar 1970 (der Unix-Epoche). Das datetime-Modul kann zwischen Zeitstempeln und Datetime-Objekten konvertieren.
from datetime import datetime, timezone
# Datetime zu Zeitstempel
dt = datetime(2026, 3, 15, 9, 30, 0)
ts = dt.timestamp()
print(ts) # 1773814200.0 (abhängig von lokaler Zeitzone)
# Zeitstempel zu Datetime (zeitzonenbewusst, empfohlen)
dt_aware = datetime.fromtimestamp(ts, tz=timezone.utc)
print(dt_aware) # 2026-03-15 01:30:00+00:00Wichtig: datetime.fromtimestamp() ohne Zeitzone gibt die Ortszeit zurück. Für UTC übergeben Sie immer tz=timezone.utc.
Zeitzonenbehandlung
Naive Datetimes (ohne Zeitzoneninformation) sind eine häufige Fehlerquelle. Python bietet zwei eingebaute Ansätze für zeitzonenbewusste Datetimes.
Verwendung von datetime.timezone (Eingebaut)
Die Klasse timezone behandelt feste UTC-Offsets.
from datetime import datetime, timezone, timedelta
# UTC
utc_now = datetime.now(timezone.utc)
print(utc_now) # 2026-02-10 14:30:00+00:00
# Fester Offset (z.B. UTC+5:30 für Indien)
ist = timezone(timedelta(hours=5, minutes=30))
india_time = datetime.now(ist)
print(india_time) # 2026-02-10 20:00:00+05:30
# Zwischen Zeitzonen konvertieren
utc_time = datetime(2026, 3, 15, 12, 0, 0, tzinfo=timezone.utc)
eastern = timezone(timedelta(hours=-5))
eastern_time = utc_time.astimezone(eastern)
print(eastern_time) # 2026-03-15 07:00:00-05:00Verwendung von zoneinfo (Python 3.9+)
Für benannte Zeitzonen mit korrekter Sommerzeitbehandlung verwenden Sie das zoneinfo-Modul.
from datetime import datetime
from zoneinfo import ZoneInfo
# Benannte Zeitzonen
utc = ZoneInfo("UTC")
eastern = ZoneInfo("America/New_York")
tokyo = ZoneInfo("Asia/Tokyo")
# Zeitzonenbewusstes Datetime erstellen
dt = datetime(2026, 7, 15, 12, 0, 0, tzinfo=utc)
print(dt) # 2026-07-15 12:00:00+00:00
# In andere Zeitzonen konvertieren
print(dt.astimezone(eastern)) # 2026-07-15 08:00:00-04:00 (EDT)
print(dt.astimezone(tokyo)) # 2026-07-15 21:00:00+09:00Naive vs. Bewusste Datetimes
| Eigenschaft | Naiv | Bewusst |
|---|---|---|
| Hat Zeitzoneninformation | Nein | Ja |
| Sicher für zonenübergreifende Vergleiche | Nein | Ja |
Erstellt von datetime.now() | Ja | Nein (es sei denn, tz wird übergeben) |
| Kann in Arithmetik gemischt werden | Nur mit anderen naiven | Nur mit anderen bewussten |
| Empfohlen für Produktion | Nein | Ja |
Sie können ein naives Datetime nicht mit einem bewussten vergleichen oder subtrahieren. Python löst einen TypeError aus.
Praktische Beispiele
Alter einer Person berechnen
from datetime import date
def calculate_age(birth_date):
"""Calculate age in years from a birth date."""
today = date.today()
age = today.year - birth_date.year
if (today.month, today.day) < (birth_date.month, birth_date.day):
age -= 1
return age
birthday = date(1995, 8, 20)
print(f"Age: {calculate_age(birthday)} years") # Age: 30 years (as of Feb 2026)Datumsbereich generieren
from datetime import date, timedelta
def date_range(start, end, step_days=1):
"""Generate dates from start to end (inclusive)."""
current = start
while current <= end:
yield current
current += timedelta(days=step_days)
start = date(2026, 2, 1)
end = date(2026, 2, 7)
for d in date_range(start, end):
print(d.strftime("%A, %B %d"))Werktage zwischen zwei Daten zählen
from datetime import date, timedelta
def business_days_between(start, end):
"""Count weekdays (Mon-Fri) between two dates, excluding endpoints."""
count = 0
current = start + timedelta(days=1)
while current < end:
if current.weekday() < 5: # 0=Mon, 4=Fri
count += 1
current += timedelta(days=1)
return count
start = date(2026, 2, 1)
end = date(2026, 2, 28)
print(f"Business days: {business_days_between(start, end)}") # Business days: 19Experimentieren mit Datetime in Jupyter
Datums- und Zeitoperationen profitieren von interaktivem Experimentieren. Wenn Sie inkonsistente Datumsformate aus einer CSV parsen oder Zeitzonenkonvertierungen debuggen, spart das schrittweise Testen in einer Notebook-Zelle erheblich Zeit.
RunCell (opens in a new tab) ist ein KI-Agent, der direkt in Jupyter-Notebooks arbeitet. Er kann Ihre Datetime-Objekte inspizieren, die richtigen strftime/strptime-Formatcodes für Ihre Daten vorschlagen und beim Debuggen von Zeitzonenkonvertierungsproblemen in Echtzeit helfen.
strftime vs strptime: Schnellvergleich
| strftime | strptime | |
|---|---|---|
| Vollständiger Name | String Format Time | String Parse Time |
| Richtung | datetime -> String | String -> datetime |
| Aufgerufen auf | Einem Datetime-Objekt | Der datetime-Klasse |
| Syntax | dt.strftime("%Y-%m-%d") | datetime.strptime(s, "%Y-%m-%d") |
| Gibt zurück | Einen formatierten String | Ein Datetime-Objekt |
| Löst aus | Nie | ValueError bei Formatfehler |
| Anwendungsfall | Anzeige, Logging, Dateinamen | Parsen von CSV, API-Antworten, Benutzereingaben |
from datetime import datetime
# strftime: datetime -> string
dt = datetime(2026, 3, 15, 9, 30)
formatted = dt.strftime("%B %d, %Y at %I:%M %p")
print(formatted) # March 15, 2026 at 09:30 AM
# strptime: string -> datetime
parsed = datetime.strptime("March 15, 2026 at 09:30 AM", "%B %d, %Y at %I:%M %p")
print(parsed) # 2026-03-15 09:30:00FAQ
Wie bekomme ich das aktuelle Datum und die aktuelle Zeit in Python?
Verwenden Sie datetime.now() aus dem datetime-Modul. Für nur das Datum verwenden Sie date.today(). Für zeitzonenbewusste aktuelle Zeit übergeben Sie eine Zeitzone: datetime.now(tz=timezone.utc). Dies sind die Standardansätze und erfordern keine Drittanbieter-Bibliotheken.
Was ist der Unterschied zwischen strftime und strptime in Python?
strftime wandelt ein Datetime-Objekt in einen formatierten String um (String aus Zeit). strptime parst einen String und wandelt ihn in ein Datetime-Objekt um (String parse Zeit). Merken Sie sich: strftime gibt Strings aus, strptime nimmt Strings entgegen. Beide verwenden die gleichen Formatcodes wie %Y, %m, %d.
Wie addiere ich Tage zu einem Datum in Python?
Verwenden Sie die Klasse timedelta. Importieren Sie sie aus datetime, dann addieren Sie sie zu Ihrem Datum: new_date = old_date + timedelta(days=7). Sie können auch weeks, hours, minutes und seconds als Parameter verwenden. Subtrahieren funktioniert genauso: past_date = today - timedelta(days=30).
Wie konvertiere ich einen String in ein Datetime in Python?
Verwenden Sie datetime.strptime(string, format). Sie müssen einen Formatstring angeben, der zu Ihrer Eingabe passt. Zum Beispiel parst datetime.strptime("2026-03-15", "%Y-%m-%d") ein ISO-Datum. Wenn der String nicht zum Format passt, löst Python einen ValueError aus, daher sollten Sie den Aufruf für externe Daten in einen try/except-Block einwickeln.
Wie behandle ich Zeitzonen in Python datetime?
Für Python 3.9+ verwenden Sie das eingebaute zoneinfo-Modul: from zoneinfo import ZoneInfo. Erstellen Sie zeitzonenbewusste Datetimes mit datetime.now(tz=ZoneInfo("UTC")) und konvertieren Sie zwischen Zonen mit dt.astimezone(ZoneInfo("America/New_York")). Für feste UTC-Offsets verwenden Sie datetime.timezone(timedelta(hours=N)). Vermeiden Sie naive Datetimes in Produktionscode.
Fazit
Pythons datetime-Modul bietet alles, was Sie für Datums- und Zeitoperationen benötigen: Daten erstellen, sie für die Anzeige formatieren, sie aus Strings parsen, Arithmetik durchführen und Zeitzonen behandeln. Die Schlüsselmuster sind konsistent und vorhersehbar, sobald Sie sie gelernt haben.
Merken Sie sich die zentrale Unterscheidung: strftime formatiert ein Datetime in einen String, strptime parst einen String in ein Datetime. Verwenden Sie timedelta für Datumsarithmetik. Verwenden Sie zoneinfo (Python 3.9+) für korrekte Zeitzonenbehandlung. Halten Sie Datetimes in Produktionscode zeitzonenbewusst, um subtile Vergleichsfehler zu vermeiden.
Für die meisten Projekte reicht das eingebaute datetime-Modul aus. Sie brauchen pytz in modernem Python nicht -- zoneinfo behandelt benannte Zeitzonen nativ. Beginnen Sie mit datetime.now(tz=timezone.utc) als Referenzpunkt und konvertieren Sie nur zur Anzeige für Benutzer in lokale Zeitzonen.