datetime - Datum, Uhrzeit und Zeitdifferenzen
Trial
Ziel
- Ich kann in Python Zeit- und Datumswerte erstellen, formatieren und verrechnen.
- Ich kenne den Unterschied zwischen aware und naive
datetime
.
Hintergrund
Das Arbeiten mit Zeit- und Datumsangaben ist in vielen Anwendungen essenziell, aber frappierend kompliziert:
verschiedene Monatslängen, Schaltjahre, Zeitzonen;
das alles bietet tausendfach Gelegenheit für Fehler und Verwirrung.
Die datetime
Bibliothek geht souverän mit alldem um und gehört zum Grundstock dessen,
was man über die Standardbibliothek wissen muss.
Detailed
Arbeitsschritte
- Legen Sie die Datei
m_datetime.py
an und benutzen Sie diese Datei für den Rest der Aufgabe. Fügen Sie ihre Python Kommandos skript-artig hintereinander in die Datei ein, mit Leerzeile getrennt.
import datetime as dt
- Der Modulname
datetime
ist länger als die meisten in der Standardbibliothek. Außerdem gibt es darin eine Klasse, die ebenfallsdatetime
heißt: verwirrend. - Deshalb importieren wir per Konvention das Modul stets so:
import datetime as dt
. Diedatetime
-Klasse ist anschließend also alsdt.datetime
anzusprechen. - Das Konstrukt
from datetime import *
ist (auch generell) nicht zu empfehlen, weil man dann leicht etwas importiert, das einen anderen Import überdeckt. Der Code wird auch schwerer lesbar.
Zeit-Objekte anlegen und ausgeben
- Finden Sie in der Dokumentation, wie man die aktuelle lokale Zeit
abfragt und geben diese mit
print("aktuelle Zeit:", ...)
aus.
Falls Sie angesichts des Umfangs der Doku dabei verzweifeln: So etwas geht mit einer Web-Suche oft schneller. Allerdings muss man sich dann vor irreführenden oder veralteten Antworten in Acht nehmen und sollte die Information in der aktuellen Dokumentation nachprüfen. - Legen Sie nun ein
datetime
-Objekt an, welches den Zeitpunkt01.12.2024, 13:09 Uhr
repräsentiert. - Finden Sie eine Funktion, mit der Sie das oben angelegte
datetime
-Objekt als String im folgenden Format ausgeben können:
Sonntag, der 01. Dezember 2024, 13:09 Uhr
Geben Sie das Ergebnis der Funktion mitprint("formatierte Zeit:", ...)
aus.
Falls das nur fast klappt und Sie Monat und Wochentag in einer anderen Sprache ausgegeben bekommen, ist bei Ihnen eine andere "locale" (Gebietsschema) eingestellt. Ihre Ausgabe ist in dem Fall OK wie sie ist. Bei Bedarf können Sie im Modullocale
nachlesen, was es damit auf sich hat.
Zeiten einlesen
- Finden Sie heraus, wie der umgekehrte Weg funktioniert: Strings in
datetime
-Objekte wandeln. - Wandeln Sie den folgenden String:
2024-12-15##13:09:44
in eindatetime
- Objekt um und geben Sie das Ergebnis mitprint("geparste Zeit:", ...)
aus.
Zeitzonen
- Lesen Sie in der Dokumentation die Konzepte "naive" (naiv) und
"aware" (gewahr) nach. Ist Ihr letztes erzeugtes
datetime
-Objekt naiv oder gewahr? - Sorgen Sie dafür, dass es in der hiesigen Zeitzone (Europe/Berlin) gewahr wird. Geben Sie das Ergebnis mit
print("Berliner Zeit:", ...)
aus.
Für diese Aufgabe kann das Modulzoneinfo
nützlich sein, welches eine konkrete Implementierung der Klassedatetime.tzinfo
bietet. Andere Module von Drittanbietern sollen in dieser Aufgabe nicht verwendet werden. - Erzeugen Sie ein zweites Objekt zum textuell selben Zeitpunkt wie das vorherige, aber in der Zeitzone "America/Caracas".
- Bestimmen Sie die Differenz zur UTC (koordinierte Weltzeit) als
timedelta
-Objekt. Geben Sie dies mitprint("UTC-Abstand:", ...)
aus.
Mit Zeiten rechnen
- Ziehen Sie diese Differenz von der Caracas-Zeit ab.
Geben Sie das Ergebnis mit
print("Caracas-nach-UTC:", ...)
aus. - Addieren Sie auf das Ergebnis 1024 Tage und 512 Minuten, Ergebnis soll erneut ein
datetime
-Objekt sein. Geben Sie dies mitprint("+1024d+512m:", ...)
aus.
Praxisbeispiel
- Sie wollen aus einem Log-File die durchschnittliche Ausführzeit mehrerer Tasks bestimmen. Das Auslesen aus der Datei haben Sie bereits implementiert und die Daten als Tupel-Liste wie folgt vorliegen:
1 2 3 4 5 6 |
|
- Fügen Sie die folgende Funktion in ihre Datei ein und vervollständigen Sie sie, sodass sie die Ausführungszeit aller
übergebenen Tasks berechnet und anschließend daraus den Durchschnitt als
timedelta
bestimmt. - Rufen Sie die Funktion anschließend mit der oben stehenden Beispielliste als Eingabe auf
und geben Sie das Ergebnis mit
print
aus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Programmlauf für die Abgabe
- 1 Führen Sie das gesamte so erzeugte Programm
m_datetime.py
einmal aus.
Trace
Program
Abgabe
Geben Sie ein Kommandoprotokoll ab, das genau nur die Eingaben und Ausgaben der obigen Kommandos 1, 2, … enthält. Entfernen Sie vor Abgabe eventuelle Fehlversuche und sonstige zusätzliche Kommandos aus dem Protokoll.
Geben Sie den Quellcode ab, wie er am Ende der Aufgabe vorliegt.