CodeGym /Kurse /C# SELF /Nützliche Typen: DateOnly und TimeOnly

Nützliche Typen: DateOnly und TimeOnly

C# SELF
Level 15 , Lektion 1
Verfügbar

1. Einführung

Früher gab es in C# keinen eigenen Typ nur für das Datum oder nur für die Uhrzeit. Selbst wenn du nur das Datum speichern wolltest – zum Beispiel einen Geburtstag – musstest du DateTime benutzen und eine "Standardzeit" hinzufügen. Der alte Weg, nur das Datum mit DateTime zu speichern:


DateTime geburtstag = new DateTime(1985, 4, 20); // 20. April 1985, 00:00:00

Aber das ist unpraktisch. Eigentlich willst du nur das Datum, bekommst aber auch noch die Zeit dazu – auch wenn sie null ist. Das kann verwirren: Zum Beispiel kann beim Vergleichen von Daten das Programm auch die Zeit berücksichtigen und du bekommst unerwartete Ergebnisse.

Das gleiche Problem andersrum: Wenn du nur mit der Uhrzeit arbeitest (zum Beispiel Arbeitszeiten von 08:00 bis 17:00), musstest du dir trotzdem ein Datum "ausdenken", obwohl das gar keine Rolle spielt.

Jetzt gibt es in .NET die speziellen Typen DateOnly und TimeOnly, die diese Verwirrung beseitigen.

Neue nützliche Typen DateOnly und TimeOnly

  • DateOnly – nur das Kalenderdatum, ohne Uhrzeit und ohne Infos zur Zeitzone.
  • TimeOnly – nur die Uhrzeit, ohne Jahr, Monat, Tag und auch wieder ohne Zeitzone.

Vergleichstabelle der Zeit-Typen

Typ Datum Zeit Zeitzone Wofür benutzt?
DateTime
🚫 Fast alles Mögliche (aber nicht immer bequem und sicher)
DateTimeOffset
Wenn du einen Zeitpunkt und die Zeitzone brauchst
DateOnly
🚫 🚫 Geburtstage, Daten ohne Uhrzeit
TimeOnly
🚫 🚫 Öffnungszeiten, Zeitpläne, Intervalle im Laufe des Tages

2. Arbeiten mit DateOnly

Deklaration und Erstellung

Ein DateOnly-Objekt zu erstellen ist wie eine neue Gewohnheit anfangen: einfach und schnell! Zum Beispiel:

// Jahr, Monat, Tag
DateOnly geburtstag = new DateOnly(1985, 4, 20);
Geburtstag mit DateOnly erstellen

Du kannst DateOnly.FromDateTime benutzen, wenn du schon ein DateTime-Objekt hast:

DateTime jetzt = DateTime.Now;
DateOnly heute = DateOnly.FromDateTime(jetzt);
// jetzt enthält heute nur das Datum, die Zeit ist weg

Wichtige Eigenschaften und Methoden

  • Year, Month, Day – wie gewohnt, wie bei DateTime.
  • .ToString() – formatiert das Datum, du kannst dein eigenes Format angeben.
Console.WriteLine($"Geburtsdatum: {geburtstag.Year} Jahr, {geburtstag.Month} Monat, {geburtstag.Day} Tag.");

Console.WriteLine(heute.ToString("dd.MM.yyyy")); // Zum Beispiel 30.07.2024

Datums-Arithmetik

Du kannst easy Tage/Monate/Jahre addieren:

DateOnly morgen = heute.AddDays(1);
DateOnly naechsterMonat = heute.AddMonths(1);

Probier mal in deiner Hauptanwendung die Felder vom Typ DateTime, die nur das Datum speichern, auf DateOnly umzustellen – dann bist du einen Schritt näher am modernen .NET!

Datumsvergleich

Vergleiche funktionieren mit <, >, ==:

if (geburtstag < heute)
    Console.WriteLine("Der Geburtstag war dieses Jahr schon oder ist lange her :)");

Fehler mit unnötigen Millisekunden und Minuten gibt's nicht mehr.

Heutiges Datum bekommen

DateOnly aktuellesDatum = DateOnly.FromDateTime(DateTime.Now);

3. Arbeiten mit TimeOnly

Jetzt kümmern wir uns um die Zeit ohne Datum – welcher Coder hatte noch nie mit Mittagspausen-Zeitplänen zu tun?

TimeOnly erstellen

TimeOnly arbeitsbeginn = new TimeOnly(9, 0);    // 09:00
TimeOnly arbeitsende = new TimeOnly(17, 30);    // 17:30

Wir können nur Stunden, Minuten, Sekunden bekommen:

Console.WriteLine($"Arbeitstag: von {arbeitsbeginn.Hour}:{arbeitsbeginn.Minute:D2} bis {arbeitsende.Hour}:{arbeitsende.Minute:D2}");

Zeit aus DateTime holen

DateTime jetzt = DateTime.Now;
TimeOnly aktuelleZeit = TimeOnly.FromDateTime(jetzt);
Console.WriteLine($"Jetzt ist es {aktuelleZeit}");

Zeit-Arithmetik

TimeOnly pauseStart = arbeitsbeginn.AddHours(4); // Pause nach 4 Stunden, also um 13:00
TimeOnly pauseEnde = pauseStart.AddMinutes(30); // 30 Minuten Mittag

Vergleiche und Checks

if (aktuelleZeit >= arbeitsbeginn && aktuelleZeit <= arbeitsende)
    Console.WriteLine("Zeit zum Arbeiten :)");
else
    Console.WriteLine("Du kannst chillen.");

4. Zusammenspiel mit anderen Typen

Konvertieren zwischen DateOnly, TimeOnly und DateTime

Manchmal musst du wieder ein DateTime bekommen (zum Beispiel für alte Datenbanken oder Kompatibilität):


DateOnly datumTeil = new DateOnly(2024, 7, 30);
TimeOnly zeitTeil = new TimeOnly(14, 15);
DateTime datumzeit = datumTeil.ToDateTime(zeitTeil); // 2024-07-30 14:15:00

Und andersrum:

DateTime dt = DateTime.Now;
DateOnly nurDatum = DateOnly.FromDateTime(dt);
TimeOnly nurZeit = TimeOnly.FromDateTime(dt);

Wichtige Besonderheiten und typische Fehler

  • Wenn du versuchst, nur das Datum oder nur die Zeit mit alten Methoden wie DateTime.Parse() zu parsen, bekommst du wahrscheinlich einen Fehler oder nicht das, was du erwartest. Dafür gibt's spezielle Methoden: Benutze DateOnly.Parse() und TimeOnly.Parse() – die wissen, wie sie mit "abgeschnittenen" Werten umgehen.
  • Wichtig zu wissen: DateOnly und TimeOnly haben null Ahnung von Zeitzonen. Das ist einfach nur ein Datum oder nur eine Uhrzeit – ohne Bezug zur Zeitzone. Wenn du Zonen brauchst, speicher die Info extra.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION