Abschnitt 10 · Lektion 4
Datum und Uhrzeit
Kaum ein Programm, das im Büro Arbeit abnimmt, kommt ohne Datum aus. Rechnungen haben ein Zahlungsziel, Verträge eine Frist, Mitgliedschaften einen Beginn. Und mit nichts verrechnet man sich von Hand so schnell wie mit einem Datum.
Vierzehn Tage von Hand
tag = 15
print(f"{tag + 14}.10.2026")
tag = 25
print(f"{tag + 14}.10.2026") Eine Rechnung vom 15.10.2026 ist in vierzehn Tagen fällig, also am 29.10.2026. Mit der Tageszahl gerechnet stimmt das noch. Beim 25. kommt dann aber der 39.10.2026 heraus, ein Tag, den es nicht gibt.
Man müsste wissen, wie viele Tage der Oktober hat, und in den nächsten Monat umbrechen. Am
Jahresende ins nächste Jahr. Und im Februar müsste man fragen, ob gerade ein Schaltjahr ist. Das
alles hat schon jemand gebaut, im Modul datetime.
Mit Tagen rechnen
from datetime import date, timedelta
rechnung = date(2026, 10, 25)
print(rechnung)
print(rechnung + timedelta(days=14))
abstand = date(2026, 12, 24) - rechnung
print(abstand)
print(abstand.days) date(2026, 10, 25) ist ein Datum (date), angelegt in der Reihenfolge Jahr, Monat, Tag. Mit print
erscheint es in der Form 2026-10-25, so wie es international üblich ist.
Gerechnet wird mit timedelta (Zeitabstand). timedelta(days=14) sind vierzehn Tage, und ein Datum
plus vierzehn Tage ist wieder ein Datum, hier der 8. November. Um das Monatsende musst du dich nicht
kümmern, das erledigt date.
Umgekehrt ergibt ein Datum minus ein Datum einen Abstand. print(abstand) gibt ihn als
60 days, 0:00:00 aus. Die nackte Zahl der Tage steht in abstand.days, und mit der kannst du
weiterrechnen. Liegt das abgezogene Datum später, ist sie negativ.
Die Zeile from datetime import date, timedelta holt zwei Namen auf einmal. Das Modul heißt
datetime, und darin gibt es neben date noch etwas, das ebenfalls datetime heißt. Das ist
verwirrend. Daran gewöhnt man sich auch nicht wirklich, man merkt es sich einfach.
Deutsch lesen und schreiben
from datetime import datetime
datum = datetime.strptime("25.10.2026", "%d.%m.%Y").date()
print(datum)
print(datum.strftime("%d.%m.%Y"))
print(datum.strftime("%A, %d. %B %Y")) Aus einer Datei kommt ein Datum als Text, "25.10.2026". Gelesen wird es mit datetime.strptime
(string parse time), und im Muster dahinter steht, wie es aufgebaut ist. %d ist der Tag, %m der
Monat und %Y das Jahr mit vier Stellen. Die Punkte stehen da, wo sie auch im Text stehen.
Groß und klein ist dabei nicht egal. %M sind Minuten, und wenn du das verwechselst, landest du
still im Januar.
strptime liefert einen Zeitpunkt mit Datum und Uhrzeit. Mit .date() dahinter bleibt nur das
Datum übrig, und das ist für Rechnungen und Fristen fast immer das, was man will. Zurück in Text
geht es mit strftime (string format time) und demselben Muster.
In der letzten Zeile steckt ein Problem. %A ist der Name des Wochentags und %B der des Monats,
und beide kommen auf Englisch, Sunday, 25. October 2026. Das ist auch auf einem deutschen Rechner
so, weil Python bei Datum und Zahlen mit der englischen Grundeinstellung anfängt.
Umstellen ginge über das Modul locale aus Lektion 6.4. Das braucht aber eine deutsche
Spracheinstellung im Betriebssystem, und die hat längst nicht jeder Rechner. Wenn ein Programm
überall dasselbe ausgeben soll, kann man sich darauf also nicht verlassen.
Wochentage aus einer Liste
from datetime import date
WOCHENTAGE = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
datum = date(2026, 10, 25)
print(datum.weekday())
print(WOCHENTAGE[datum.weekday()] + ", " + datum.strftime("%d.%m.%Y")) weekday() gibt den Wochentag als Zahl zurück. Die Woche fängt dabei am Montag mit 0 an. Der
25.10.2026 ist ein Sonntag, also eine 6. Dazu eine Liste mit den sieben Namen in genau dieser
Reihenfolge, und die Zahl ist die Position darin. Mehr ist es nicht, und es geht auf jedem Rechner
gleich.
Die Liste steht in Großbuchstaben da, WOCHENTAGE. Sie ist eine Konstante wie in Lektion 8.5, weil
sie sich nie ändert, solange das Programm läuft.
Ein Datum mit Uhrzeit
from datetime import date, datetime
stichtag = date(2026, 11, 2)
faellig = datetime.strptime("08.11.2026", "%d.%m.%Y")
print(faellig)
print(faellig - stichtag) Ohne .date() hinter strptime steht 2026-11-08 00:00:00 da, ein Zeitpunkt um Mitternacht. Und
den kann man nicht von einem Datum abziehen. Das Programm endet mit
TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'datetime.date'. Für Python
sind das zwei verschiedene Arten von Wert, und welche Uhrzeit ein Datum haben soll, wird nicht
geraten. Mit .date() hinter dem strptime sind es zwei Daten, und dann kommen sechs Tage heraus.
Für den Tag, an dem ein Programm läuft, gibt es date.today(). In den Aufgaben dieses Kurses steht
stattdessen ein festes Datum, weil mit date.today() morgen ein anderes Ergebnis herauskäme als
heute und sich dann nichts mehr prüfen ließe. Im fertigen Werkzeug auf deinem Rechner ist
date.today() aber genau richtig.
Der Rechner, auf dem dein Code hier läuft, geht übrigens nach Weltzeit (UTC). Nach deutscher Zeit ist es eine oder zwei Stunden später. Kurz nach Mitternacht ist dort also noch gestern.
Was die Aufgabe will
Es gibt eine Liste offener Rechnungen, jede mit Datum und Zahlungsziel in Tagen. Zu jeder gehört ein Termin, bis wann sie bezahlt sein muss, samt Wochentag auf Deutsch. Dazu ein Satz, wie es an einem festen Stichtag um sie steht. Überfällig, heute fällig oder noch ein paar Tage Zeit.
Zum Mitnehmen
Mit date aus dem Modul datetime rechnest du in Tagen. date(2026, 10, 25) plus timedelta(days=14) ergibt den 08.11.2026, und zwei Daten voneinander abgezogen ergeben die Tage dazwischen. Ein deutsches Datum liest datetime.strptime, strftime macht wieder Text daraus. Deutsche Wochentage holt man mit weekday() aus einer eigenen Liste.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 5 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.