6. Datum und Zeit
Der Umgang mit Datums- und Zeitangaben gestaltet sich in allen Programmiersprachen relativ schwierig.
Das liegt aber nicht am Code, sondern an der riesigen Anzahl von Sonderfällen:
- Zeitzonen,
- Schaltjahren und -sekunden
- Sommer- und Winterzeit
- unterschiedliche Darstellungen (Formatierungen) je nach Landessprache
Ich werde nicht auf alle Möglichkeiten eingehen, werde aber versuchen die Möglichkeiten zu beschreiben.
Python unterscheidet generell zwischen zwei Arten von Zeitobjekten:
naive: Objekte geben einen Zeitpunkt an, Ihnen fehlt aber die Kontextinformationen in welcher Zeitzone die Zeit gilt, ob gerade Sommer- oder Winterzeit herrscht. Für viele Anwendungsfälle sind diese Informatioenn nicht erforderlich, dann vereinfachen naive Objekte die Programmierung.
aware: Zeitobjekte, die die o.g. Kontextinformation besitzen, werden aware genannt. Bei solchen Objekten ist eine Feststellung möglich, welcher Zeitpunkt absolut gesehen früher oder später ist.
Die meisten Zeitobjekte sind immutable, also unveränderlich. Ein einmal erzeugtes Zeitobjekt kann man also nicht mehr ändern. Wenn Zeitberechnungen durchgeführt werden, dann erzeugen SIe dabei immer ein neues Zeitobjekt.
6.1. Zeit ermitteln und darstellen
Um die aktuelle Zeit ermitteln sie mit der now Funtion der datetime Klasse, die wiederum ein Teil des datetime Moduls ist. Es hört sich kompliziert an, ist es aber gar nicht.
from datetime import datetime
now = datetime.nw()
print(now) # Ergebnis: 2025-05-21 12:35:00.297110print(now.year) # Ausgabe: 2025
print(now.month) # Ausgabe: 5Um Datum und Uhrzeit formatiert auszugeben, kann man auf die Methoden isoformat und strftime zurückgreifen.
print(now.isoformat()) # Ausgabe: 2025-05-25T13:00:03.297110
print(now.strftime('%d.%m.%Y %H:%M')) # Ausgabe: 25.05.2025 13:00Es wird ein wenig aufwendiger, wenn man Monats-, Wochentage usw. in der jeweiligen System- und Landessprache verwenden will. Standardmässig benutzt Python die englische Sprachausgabe.
print(now.strftime('%A, %d. %B %Y')) # Ausgabe: Tuesday, 27. May 2025Abhilfe schafft das locale Module und seine Methode setlocale, die ich bereits vorgestellt hatte.
import locale
locale.setlocale(locale.LC_ALL, 'de_DE.utf8') # Linux
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') # macOS
locale.setlocale(locale.LC_ALL, 'german') # Windows
print(now.strftime('%A, %d. %B %Y')) # Ausgabe: Dienstag, 27. Mai 20256.1.1. Datum aus Zeichenketten einlesen
Die Umkehrmethode zu strftime ist strptime, wobei das p für parse steht. Diese Methode erzeugt damit aus einer Zeichenkette, dessen Format bekannt ist, ein datetime Objekt.
s = '2025-05-27 16:40'
dt = datetime.strptime(s, '%Y-%m-%d %H:%M')6.1.2. Datum ohne Zeit
Falls man nur an einem Datum interessiert ist, also ohne Uhrzeit, arbeitet man mit einem date-Objekt. Das aktuelle Datum entnimmt man dann mit today.
from datetime import date
today = date.today()
print(today) # Ausgabe: 2025-05-27Als Alternative könnte man auch aus einem bereits vorhandenden datetime Objekt durch das anhängen von date() den Datumsteil extrahieren.
now = datetime.now()
print(now.date()) # Ausgabe: 2025-05-276.1.3. Zeit ohne Datum
Da es eine mit today vergleichbare Methode in Python nicht gibt, muss man auf dem einfachsten Weg versuchen die Zeit zu ermitteln.
print(datetime.now().time()) # Ausgabe: 20:38:10:331885Falls man ein date- und ein time Objekt zu einem datetime Objekt kombinieren möchte, so verwendet man combine.
from datetime import date, time, datetime
today = date.today()
clock = datetime.now().time()
together = datetime.combine(today, clock)6.1.4. Objekte für einen beliebigen Zeitpunkt
Wenn es innerhalb des Programmes nicht um den aktuellen Zeitpunkt geht, so kann man auch ein beliebiges datetime objekt erstellen, indem Sie Jahr, Monat, Tag, Stunde, Minute und Sekunde als Parameter an datetime übergibt.
from datetime import datetime
somedate = datetime(2025, 5, 25, 20, 44, 18)
print(somedate.isoformat()) # Ausgabe: 2025-05-25 20:44:18Wenn man ein Datum ohne Zeitangabe so erzeugen möchte verwendet man folgendes.
from datetime import date
otherdate = date(2025, 5, 27)
print(otherdate.isoformat()) # Ausgabe: 2025-05-27Analog dazu funktioniert es auch mit dem reinen Zeitpunkt ohne Datumsangabe
from datetime import time
sometime = time(20, 48, 17)
print(sometime,isoformat()) # Ausgabe: 20:48:176.1.5. Zeiten mit Zeitzonen
Alle bisherige vorgestellten Zeitobjekte waren naive. Um Zeitobjekte erstellen zu können, die den Zeitzonen zugeordnet sind, muss zuerst das Paket pytz installiert werden. Zum Thema Module installieren mit pip werden wir uns in einem späteren Abschnitt beschäfftigen.
Sobald pytz Ihnen als Modul zur Verfügung steht, werden die Variablen mit der Weitzeit (Universal Time Coordinated (UTC)) inistialisiert.
from datetime import datetime
import pytz
utc = datetime.now(pytz.utc)
print(utc) # Ausgabe: 2025-05.27 20:57:16.353862+00:00Wenn man in einem Programm absolute Zeiten benötigt, empfiehlt pytz generell mit UTC Zeiten zu arbeiten. Um die lokale Zeit, die in dem Betriebssystem eingestellt ist, ruft man die Methode astimezone ohne Parameter auf.
localtime = utc.astimezone()
print(localtime) # Ausgabe: 2025-05-29 12:46:30.335862+02:00Alternativ kann man auch ein beliebiges Zeitzonenobjekt einrichten und diesen an astimezone übergeben.
berlin = pytz.timezone('Europe/Berlin')
print(utc.astimezone(berlin)) # Ausgabe: 2025-05-29 12:49:30.353862+02:006.2. Mit Zeiten rechnen
Wenn man von einem Zeitpunkt ausgeht, kann man Zeit bzw. Datum berechnen, indem man eine Zeitspanne addiert. Dazu greift man auf ein timedelta Objekt zurück, welches sich ebenfalls im datetime Modul befindet.
from datetime import date, datetime, timedelta
today = datetime.now().date # date
week = timedelta(weeks - 1) # timedelta
print(today, today + week, today + 3 + week) # Ausgabe: 2025-05-29 2025-06-05 2025-06-19
now = datetime.now() # datetime
minute = timedelta.minutes - 1) # timedelta
soon = now + 10 * minute # detatime
print(now.time(), soon.time()) # Ausgabe: 12:58:43.116115 13:08:43.1161156.2.1. Zeiten subtrahieren
Wenn man zwei date, datetime oder time Objekte voneinander subtrahieren möchte, erhält man ein timedelta Objekt zurück. Im nächsten Schritt kann man dessen Eigenschaften auswerten. Ein gutes Beispiel ist es herauszufinden, wieviel Tage es noch bis Weihnachten sind.
from datetime import date, timedelta
today = date.today()
christmas = date(today.year, 12, 24)
wait = christmas - today
print('Es sind noch ', wait.days, ' Tage bis Weihnachten.')
# Ausgabe: Es sind noch 209 Tage bis Weihnachten6.2.2. Laufzeit von Code messen
Mitunter muss man feststellen, wie lange es dauert, eine bestimmte Ausgabe in Python zu erledigen. Das Verfahren dazu greift auf die prozess_time aus dem time Modul zurück. Diese Methode liefert die CPU Laufzeit des Prozesses abzüglich eventueller Schlafphasen der CPU.
#!/usr/bin/env python3
import time, math
start = time.process_time()
# sinnlos time totschlagen
for i in range(1, 100000):
x = math.sin(i)
end = time.process_time()
print(end - start, 'Sekunden')Obwohl dies so trivial aussieht, bemerken Sie sofort bei mehrfachem Start, das die Laufzeit jedes mal ein wenig anders ist. Eine Diskussion dazu findet man im Internet.
6.2. Aufgaben:
1.) Geben Sie das heutige Datum in der Form Samstag, 19.09. aus, also mit Wochentag, aber ohne Jahreszahl.
2.) Ein Kinofilm beginnt um 19:30 Uhr und dauert 132 Minuten. Um welche Uhrzeit ist der Kinofilm zu ende?
3.) Ermitteln Sie, wieviele Sekunden seit Mitternacht vergangen sind.