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

<datetime> ist sowohl ein Modul als auch ein Klassenname.

Die obige import – Anweisung sieht verwirrend aus. Das liegt daran, dass das datetime – Modul diverse Klassen enthält.
Eine davon ist die datetime Klasse und genau die soll hier mit minimalem Tippaufwand eingesetzt werden. Würden Sie nur import datetime ausführen, dann würde bei jedem Aufruf auf diese Klasse eine Verdopplung erforderlich, z.B.: datetime.datetime.now()
Die einzelnen Zeitkomponenten kann man nun mit den Eigenschaften year, month, day, hour, minute, second und microsec auswerten.

print(now.year)                         # Ausgabe: 2025
print(now.month)                        # Ausgabe: 5

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

Es 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 2025

Abhilfe 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 2025

6.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-27

Als 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-27

6.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:331885

Falls 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:18

Wenn 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-27

Analog 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:17

6.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:00

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

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

6.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.116115

6.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 Weihnachten

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