Skip to content

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.123456

Der 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:00

Datetime-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:00

Sie 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:45

Daten 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, 2026

Hier eine einfache Eselsbrücke: strftime = string from time (Datetime zu String).

strftime-Formatcodes Referenz

CodeBedeutungBeispiel
%Y4-stelliges Jahr2026
%y2-stelliges Jahr26
%mMonat als nullgepolsterte Zahl03
%BVollständiger MonatsnameMarch
%bAbgekürzter MonatsnameMar
%dTag des Monats (nullgepolstert)15
%AVollständiger WochentagsnameSunday
%aAbgekürzter WochentagsnameSun
%HStunde (24-Stunden, nullgepolstert)09
%IStunde (12-Stunden, nullgepolstert)09
%MMinute (nullgepolstert)05
%SSekunde (nullgepolstert)07
%pAM/PMAM
%fMikrosekunde (nullgepolstert auf 6 Stellen)000000
%zUTC-Offset (+HHMM oder -HHMM)+0000
%ZZeitzonennameUTC
%jTag des Jahres (001-366)074
%%Literales %-Zeichen%

Häufig verwendete Formatmuster

MusterFormatstringAusgabe
ISO 8601%Y-%m-%dT%H:%M:%S2026-03-15T09:05:07
US-Datum%m/%d/%Y03/15/2026
Europäisches Datum%d/%m/%Y15/03/2026
Lesbares Datum%B %d, %YMarch 15, 2026
Log-Zeitstempel%Y-%m-%d %H:%M:%S2026-03-15 09:05:07
12-Stunden-Zeit%I:%M:%S %p09:05:07 AM
Kompaktes Datum%Y%m%d20260315
Dateisicherer Zeitstempel%Y%m%d_%H%M%S20260315_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:00

Merken 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:00

Datumsarithmetik 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:00

Zeitdifferenzen 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.0

timedelta-Konstruktorparameter

ParameterBeschreibungBeispiel
weeksAnzahl der Wochentimedelta(weeks=2) = 14 Tage
daysAnzahl der Tagetimedelta(days=30)
hoursAnzahl der Stundentimedelta(hours=12)
minutesAnzahl der Minutentimedelta(minutes=45)
secondsAnzahl der Sekundentimedelta(seconds=120)
millisecondsAnzahl der Millisekundentimedelta(milliseconds=500)
microsecondsAnzahl der Mikrosekundentimedelta(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.0

Daten 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)   # True

Daten 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, 2026

Mit 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:00

Wichtig: 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:00

Verwendung 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:00

Naive vs. Bewusste Datetimes

EigenschaftNaivBewusst
Hat ZeitzoneninformationNeinJa
Sicher für zonenübergreifende VergleicheNeinJa
Erstellt von datetime.now()JaNein (es sei denn, tz wird übergeben)
Kann in Arithmetik gemischt werdenNur mit anderen naivenNur mit anderen bewussten
Empfohlen für ProduktionNeinJa

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: 19

Experimentieren 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

strftimestrptime
Vollständiger NameString Format TimeString Parse Time
Richtungdatetime -> StringString -> datetime
Aufgerufen aufEinem Datetime-ObjektDer datetime-Klasse
Syntaxdt.strftime("%Y-%m-%d")datetime.strptime(s, "%Y-%m-%d")
Gibt zurückEinen formatierten StringEin Datetime-Objekt
Löst ausNieValueError bei Formatfehler
AnwendungsfallAnzeige, Logging, DateinamenParsen 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:00

FAQ

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.

📚