Arbeiten mit Daten in C# (.NET): vollständiger Überblick über Bibliotheken und integrierte Werkzeuge
Die Verarbeitung von Datums- und Zeitangaben gehört zu den häufigsten Aufgaben in der Entwicklung. Im C# (.NET)-Ökosystem gibt es sowohl leistungsstarke integrierte Funktionen (System.DateTime) als auch Drittanbieter-Bibliotheken, die komplexe Szenarien vereinfachen: Arbeit mit Zeitzonen, Formatierung, Intervalle und Parsing. In diesem Artikel betrachten wir die wichtigsten Werkzeuge, einschließlich der modernen Möglichkeiten von .NET 6+ und beliebter NuGet-Pakete.
1. Integrierte Mittel: DateTime, DateOnly, TimeOnly
Die Basisklasse System.DateTime ist seit den ersten Versionen von .NET verfügbar. Sie unterstützt:
- Erstellung eines Datums:
new DateTime(2025, 3, 15) - Arithmetik:
date.AddDays(10),date.AddMonths(-1) - Vergleich:
date1 > date2 - Formatierung:
date.ToString("yyyy-MM-dd")
Ab .NET 6 kamen die Typen DateOnly und TimeOnly hinzu – sie sind nicht an eine Zeitzone gebunden und speichern nur das Datum oder nur die Uhrzeit. Dies ist praktisch für Geburtstage, Arbeitszeitpläne und Zeitpläne.
using System;
DateOnly birthday = new DateOnly(1990, 5, 20);TimeOnly alarm = new TimeOnly(7, 30);
Console.WriteLine($"Datum: {birthday}, Uhrzeit: {alarm}");// Ausgabe: Datum: 20.05.1990, Uhrzeit: 07:302. TimeSpan — Zeitintervalle
Für die Arbeit mit Zeitabständen wird TimeSpan verwendet. Es ermöglicht die Berechnung der Differenz zwischen Daten, der Dauer von Vorgängen und von Timeouts.
DateTime start = DateTime.Now;// ... Codeausführung ...DateTime end = DateTime.Now;
TimeSpan elapsed = end - start;Console.WriteLine($"Vergangen: {elapsed.TotalSeconds} Sek.");3. Noda Time — erweiterte Arbeit mit Daten
Noda Time (NuGet: NodaTime) ist eine Bibliothek von Jon Skeet (Autor eines beliebten C#-Buches). Sie löst die Probleme von DateTime:
- Klare Trennung zwischen „Moment in der Zeit“ (
Instant), „Datum im Kalender“ (LocalDate) und „Zeit mit Zeitzone“ (ZonedDateTime). - Unterstützung für Kalender (islamischer, jüdischer, japanischer).
- Unveränderlichkeit aller Typen.
- Korrekte Verarbeitung von Zeitzonen über die IANA-Datenbank (tzdata).
using NodaTime;
Instant now = SystemClock.Instance.GetCurrentInstant();DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(zone);
Console.WriteLine($"Aktuelle Zeit in Moskau: {moscowTime:yyyy-MM-dd HH:mm}");
// Arbeiten mit LocalDateLocalDate today = LocalDate.FromDateTime(DateTime.Today);LocalDate nextWeek = today.PlusDays(7);Noda Time ist besonders nützlich in Projekten, bei denen die Genauigkeit von Zeitzonen kritisch ist (Logs, Buchungen, internationale Systeme).
4. Humanizer — menschenlesbare Daten
Humanizer (NuGet: Humanizer.Core) ist eine Bibliothek zur Umwandlung von Zahlen, Daten und Zeiten in natürliche Sprache. Sie kann:
- Relative Zeit anzeigen: "vor 3 Minuten", "in 2 Tagen".
- Monats- und Wochentagsnamen deklinieren.
- Zeitintervalle formatieren: "1 Stunde 30 Minuten".
using Humanizer;
DateTime pastDate = DateTime.UtcNow.AddHours(-5);Console.WriteLine(pastDate.Humanize()); // "vor 5 Stunden"
TimeSpan span = new TimeSpan(2, 45, 0);Console.WriteLine(span.Humanize()); // "2 Stunden 45 Minuten"Humanizer unterstützt Lokalisierung (Russisch — Humanizer.Core.ru).
5. FluentDateTime — Fluent-Schnittstelle für DateTime
FluentDateTime (NuGet: FluentDateTime) fügt Erweiterungsmethoden für eine bequemere Arbeit mit DateTime hinzu.