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? |
|---|---|---|---|---|
|
✅ | ✅ | 🚫 | Fast alles Mögliche (aber nicht immer bequem und sicher) |
|
✅ | ✅ | ✅ | Wenn du einen Zeitpunkt und die Zeitzone brauchst |
|
✅ | 🚫 | 🚫 | Geburtstage, Daten ohne Uhrzeit |
|
🚫 | ✅ | 🚫 | Ö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);
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.
GO TO FULL VERSION