Das Python datetime-Modul verstehen
Datumsangaben und Zeiten in Python mit dem datetime-Modul verarbeiten: date, time, datetime, timedelta, strftime, strptime und Zeitzonen.
Python besitzt keinen dedizierten eingebauten Datumstyp. Stattdessen bietet das datetime-Modul der Standardbibliothek ein vollständiges Werkzeugset zum Erstellen, Bearbeiten, Formatieren und Parsen von Datums- und Zeitangaben. Dieses Kapitel behandelt alle zentralen Klassen — date, time, datetime, timedelta und timezone — und zeigt praktische Muster, die Sie regelmäßig verwenden werden.
Das Modul importieren
Das datetime-Modul ist Teil der Standardbibliothek und erfordert keine Installation. Sie können es auf zwei gängige Weisen importieren:
# Import the module and qualify every name
import datetime
today = datetime.date.today()
# Import specific classes directly
from datetime import date, time, datetime, timedelta, timezone
today = date.today()Der from datetime import ...-Stil ist in der Praxis kürzer und wird in diesem Kapitel durchgehend verwendet.
Die date-Klasse
date repräsentiert ein Kalenderdatum (Jahr, Monat, Tag) ohne Tageszeit-Komponente.
date-Objekte erstellen
Auf Datumsattribute zugreifen
Wenn Sie ein date-Objekt haben, können Sie dessen Jahr, Monat und Tag als Integer-Attribute auslesen und abfragen, auf welchen Wochentag es fällt:
from datetime import date
d = date(2024, 6, 15)
print(d.year) # 2024
print(d.month) # 6
print(d.day) # 15
# weekday(): Monday = 0, Sunday = 6
print(d.weekday()) # 5 (Saturday)
# isoweekday(): Monday = 1, Sunday = 7
print(d.isoweekday()) # 6 (Saturday)Die time-Klasse
time repräsentiert eine Tageszeit (Stunde, Minute, Sekunde, Mikrosekunde) unabhängig von einem bestimmten Datum.
from datetime import time
# time(hour, minute, second) — all arguments optional, default to 0
t = time(14, 30, 0)
print(t) # 14:30:00
print(t.hour) # 14
print(t.minute) # 30
print(t.second) # 0Die time-Klasse ist besonders nützlich, wenn Sie Uhrzeiten speichern oder vergleichen möchten, ohne das Datum zu berücksichtigen — zum Beispiel „Erinnere mich täglich um 09:00 Uhr."
Die datetime-Klasse
datetime ist die Hauptklasse. Sie kombiniert ein vollständiges Datum und eine Tageszeit in einem Objekt und ist das, was Sie in den meisten realen Programmen verwenden werden.
Aktuelles Datum und aktuelle Uhrzeit abrufen
from datetime import datetime
# Local system time (naive — no time zone)
now = datetime.now()
print(now) # e.g. 2024-06-15 14:30:45.123456
# UTC time
utc_now = datetime.utcnow()
print(utc_now) # e.g. 2024-06-15 18:30:45.123456datetime-Objekte erstellen
from datetime import datetime, date, time
# Constructor: datetime(year, month, day, hour=0, minute=0, second=0)
dt = datetime(2024, 6, 15, 14, 30, 45)
print(dt) # 2024-06-15 14:30:45
# From an ISO 8601 string
dt2 = datetime.fromisoformat("2024-06-15T14:30:45")
print(dt2) # 2024-06-15 14:30:45
# Combine a date and a time object
combined = datetime.combine(date(2024, 6, 15), time(14, 30, 0))
print(combined) # 2024-06-15 14:30:00Auf datetime-Attribute zugreifen
datetime stellt alle Attribute von date und time bereit:
from datetime import datetime
dt = datetime(2024, 6, 15, 14, 30, 45)
print(dt.year) # 2024
print(dt.month) # 6
print(dt.day) # 15
print(dt.hour) # 14
print(dt.minute) # 30
print(dt.second) # 45
# Extract just the date or time part
print(dt.date()) # 2024-06-15
print(dt.time()) # 14:30:45Die timedelta-Klasse
timedelta repräsentiert eine Zeitspanne — die Differenz zwischen zwei Zeitpunkten. Sie wird verwendet, um Zeitspannen zu date- und datetime-Objekten zu addieren oder zu subtrahieren.
timedelta erstellen und verwenden
from datetime import date, timedelta
today = date(2024, 6, 15)
# Add 30 days
future = today + timedelta(days=30)
print(future) # 2024-07-15
# Subtract 7 days
last_week = today - timedelta(weeks=1)
print(last_week) # 2024-06-08
# timedelta can express days, seconds, and microseconds
# Convenience arguments: days, seconds, microseconds, milliseconds, minutes, hours, weeks
delta = timedelta(hours=2, minutes=30)
print(delta) # 2:30:00Die Differenz zwischen zwei Datumsangaben berechnen
Das Subtrahieren eines date- oder datetime-Werts von einem anderen gibt ein timedelta zurück:
from datetime import date
start = date(2024, 1, 1)
end = date(2024, 6, 15)
diff = end - start
print(diff) # 166 days, 0:00:00
print(diff.days) # 166Dies ist der Standardweg, um die Anzahl der Tage zwischen zwei Datumsangaben zu berechnen. Verwenden Sie .total_seconds() auf einem timedelta, wenn Sie die Zeitspanne in Sekunden benötigen.
Datums- und Zeitangaben formatieren (strftime)
strftime ("string format time") wandelt ein date- oder datetime-Objekt in eine lesbare Zeichenkette um. Sie übergeben einen Formatstring, der Direktiven enthält, die mit % beginnen.
from datetime import datetime
dt = datetime(2024, 6, 15, 14, 30, 45)
print(dt.strftime("%Y-%m-%d")) # 2024-06-15
print(dt.strftime("%d/%m/%Y")) # 15/06/2024
print(dt.strftime("%A, %B %d, %Y")) # Saturday, June 15, 2024
print(dt.strftime("%I:%M %p")) # 02:30 PM
print(dt.strftime("%Y-%m-%d %H:%M:%S")) # 2024-06-15 14:30:45Häufige strftime-Direktiven
| Direktive | Bedeutung | Beispiel |
|---|---|---|
%Y | 4-stelliges Jahr | 2024 |
%y | 2-stelliges Jahr | 24 |
%m | Monat als nullaufgefüllte Zahl | 06 |
%B | Vollständiger Monatsname | June |
%b | Abgekürzter Monatsname | Jun |
%d | Tag des Monats, nullaufgefüllt | 15 |
%A | Vollständiger Wochentagsname | Saturday |
%a | Abgekürzter Wochentagsname | Sat |
%H | Stunde (24-Stunden-Format) | 14 |
%I | Stunde (12-Stunden-Format) | 02 |
%M | Minute | 30 |
%S | Sekunde | 45 |
%p | AM oder PM | PM |
%j | Tag des Jahres | 167 |
%W | Wochennummer des Jahres | 24 |
Datums- und Zeitangaben parsen (strptime)
strptime ("string parse time") ist das Gegenteil von strftime: Es wandelt eine Zeichenkette in ein datetime-Objekt um. Sie müssen einen Formatstring angeben, der zur Eingabe passt.
Ein häufiger Stolperstein: strptime gibt immer ein datetime zurück, selbst wenn die Zeichenkette nur ein Datum enthält. Rufen Sie .date() auf dem Ergebnis auf, wenn Sie ein einfaches date-Objekt benötigen.
ISO-8601-Format
Der ISO-8601-Standard (YYYY-MM-DDTHH:MM:SS) ist der portabelste Weg, Datums- und Zeitwerte auszutauschen. Python bietet dafür eingebaute Hilfsfunktionen:
from datetime import datetime
dt = datetime(2024, 6, 15, 14, 30, 45)
# Produce ISO 8601 string
print(dt.isoformat()) # 2024-06-15T14:30:45
# Parse ISO 8601 string (Python 3.7+)
dt2 = datetime.fromisoformat("2024-06-15T14:30:45")
print(dt2) # 2024-06-15 14:30:45Mit Zeitstempeln arbeiten
Ein Unix-Zeitstempel ist die Anzahl der Sekunden, die seit dem 1. Januar 1970 00:00:00 UTC vergangen sind. Python kann zwischen Zeitstempeln und datetime-Objekten konvertieren:
Zeitzonen
Standardmäßig gibt datetime.now() ein naives Datetime zurück — es enthält keine Zeitzoneniformation. Das Hinzufügen eines tzinfo-Objekts macht es bewusst (aware). Bewusste Datetimes sind unerlässlich, wenn Ihr Programm Benutzer in mehreren Zeitzonen verwaltet oder Zeitstempel in einer Datenbank speichert.
Die eingebaute timezone verwenden
datetime.timezone stellt timezone.utc bereit und ermöglicht das Erstellen von Zonen mit festem Offset:
from datetime import datetime, timezone, timedelta
# Create an aware UTC datetime
utc_dt = datetime(2024, 6, 15, 14, 30, 45, tzinfo=timezone.utc)
print(utc_dt) # 2024-06-15 14:30:45+00:00
# Create a fixed +5:30 (India Standard Time) offset
ist_offset = timezone(timedelta(hours=5, minutes=30))
ist_dt = utc_dt.astimezone(ist_offset)
print(ist_dt) # 2024-06-15 20:00:45+05:30zoneinfo verwenden (Python 3.9+)
Für echte IANA-Zeitzonen wie America/New_York oder Asia/Tokyo verwenden Sie das eingebaute zoneinfo-Modul (Python 3.9+). Es verarbeitet die Sommerzeit automatisch.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
# UTC aware datetime
utc_dt = datetime(2024, 6, 15, 14, 30, 45, tzinfo=timezone.utc)
# Convert to Eastern Time (handles DST automatically)
eastern = ZoneInfo("America/New_York")
eastern_dt = utc_dt.astimezone(eastern)
print(eastern_dt) # 2024-06-15 10:30:45-04:00
# Convert to Tokyo time
tokyo = ZoneInfo("Asia/Tokyo")
tokyo_dt = utc_dt.astimezone(tokyo)
print(tokyo_dt) # 2024-06-15 23:30:45+09:00Auf Python 3.8 und früher installieren Sie die Drittanbieter-Bibliothek pytz für IANA-Zeitzonenunterstützung.
Komponenten ersetzen
replace() gibt ein neues Objekt zurück, bei dem bestimmte Felder geändert wurden. Das Original wird nie verändert.
from datetime import datetime
dt = datetime(2024, 6, 15, 14, 30, 45)
# Change only the year
dt2 = dt.replace(year=2025)
print(dt2) # 2025-06-15 14:30:45
# Change hour and minute
dt3 = dt.replace(hour=9, minute=0, second=0)
print(dt3) # 2024-06-15 09:00:00Datums- und Zeitangaben vergleichen
date- und datetime-Objekte unterstützen alle standardmäßigen Vergleichsoperatoren:
from datetime import date
d1 = date(2024, 1, 1)
d2 = date(2024, 6, 15)
print(d1 < d2) # True
print(d1 == d2) # False
# Find the earliest date
earliest = min(d1, d2)
print(earliest) # 2024-01-01Vergleichen Sie ausschließlich bewusste Datetimes mit bewussten Datetimes und naive mit naiven — das Mischen führt zu einem TypeError.
Alles zusammenfügen
Hier ist ein praktisches Beispiel, das mehrere Konzepte kombiniert: Es berechnet, wie viele Tage bis zu einem zukünftigen Termin verbleiben, und formatiert beide Datumsangaben für die Ausgabe.
from datetime import date
deadline = date(2024, 12, 31)
today = date(2024, 6, 15)
days_left = (deadline - today).days
print(f"Today: {today.strftime('%B %d, %Y')}") # June 15, 2024
print(f"Deadline: {deadline.strftime('%B %d, %Y')}") # December 31, 2024
print(f"Days remaining: {days_left}") # 199Schnellreferenz
| Aufgabe | Code |
|---|---|
| Heutiges Datum | date.today() |
| Aktuelles Datum und Uhrzeit | datetime.now() |
| Bestimmtes Datum | date(2024, 6, 15) |
| Datum aus Zeichenkette | datetime.strptime(s, fmt) |
| Datum in Zeichenkette | dt.strftime(fmt) |
| ISO-Format | dt.isoformat() / datetime.fromisoformat(s) |
| Tage addieren/subtrahieren | d + timedelta(days=N) |
| Tage zwischen Datumsangaben | (d2 - d1).days |
| Zeitzone konvertieren | dt.astimezone(ZoneInfo("Zone/Name")) |