
Zeitverarbeitung in .NET ist komplexer als sie scheint. Standardtypen wie DateTime führen häufig zu Fehlern bei Zeitzonen, Sommerzeit oder Tests.
NodaTime bietet klar definierte Typen wie Instant, LocalDateTime oder ZonedDateTime und basiert auf der TZ Database. Das Ergebnis: präzisere Semantik, bessere Testbarkeit und weniger produktive Fehler.
In fast jedem Softwareprojekt spielt Zeit eine Rolle, sei es bei Terminen, Buchungen, Logdaten, medizinischen Messwerten oder automatisierten Prozessen. Doch die Arbeit mit Zeitangaben in .NET ist oft fehleranfällig. Klassische Typen wie DateTime oder DateTimeOffset sind zwar bequem, verbergen aber viele Fallstricke, wie unklare Bedeutung (lokal, UTC oder unspecified?), Sommerzeit-Umstellungen, fehlende Zeitzoneninformationen und schwierige Tests. Diese Probleme führen in der Praxis regelmäßig zu schwer auffindbaren Bugs, besonders in internationalen oder langlaufenden Systemen.
NodaTime ist eine Open-Source-Bibliothek für .NET, entwickelt von Jon Skeet (Google). Sie basiert auf dem bewährten Java-Konzept Joda-Time und verfolgt das Ziel, Zeitverarbeitung explizit, verständlich und korrekt zu machen. Statt nur einen einzigen Typ für alles zu verwenden, bietet NodaTime eine klare Typenhierarchie.
Folgende wichtige Typen gehören dazu:
Instant: Ein eindeutiger Zeitpunkt auf der universellen Zeitlinie (z. B. ein Log-Timestamp).
LocalDate: Ein Datum ohne Uhrzeitangabe und ohne Zeitzone (z. B. ein Geburtstag).
LocalTime: Eine Uhrzeit ohne Datum (z. B. Öffnungszeiten).
LocalDateTime: Datum und Uhrzeit, aber ohne Zeitzoneninformation.
ZonedDateTime: Ein vollständiger Zeitstempel mit Zeitzone (z. B. ein Buchungszeitpunkt).
Duration: Eine feste Zeitspanne in Ticks.
Period: Eine kalendarische Zeitspanne (z. B. 1 Monat und 3 Tage).
Dieser bewusste Unterschied zwischen "wann" und "was für ein Datum/eine Uhrzeit in welcher Zeitzone" führt zu deutlich robusterem und ausdrucksstärkerem Code.

Eine LocalDate repräsentiert ein reines Datum, unabhängig von Zeitzonen oder Uhrzeiten.

Der DateTimeZoneProvider liefert die gewünschte Zeitzone. Mit InZoneLeniently wird der lokale Zeitpunkt in einen vollständigen ZonedDateTime umgewandelt, der alle Zeitzonenwechsel korrekt berücksichtigt.

Mit Period.Between lassen sich kalendarische Differenzen exakt berechnen, ohne die typischen Fallstricke von DateTime.

NodaTime.Serialization.SystemTextJson bietet direkte Unterstützung für den modernen JSON-Serializer von .NET. Damit lassen sich NodaTime-Typen problemlos in ASP.NET Core-APIs und modernen .NET-Projekten verwenden.

Durch die Verwendung von IClock statt DateTime.UtcNow ist der Code testbar: Im Produktivbetrieb wird SystemClock.Instance genutzt, im Test eine FakeClock mit fixer Zeit.
NodaTime lässt sich leicht in ASP.NET Core integrieren. Zusätzliche Pakete wie NodaTime.Serialization.SystemTextJson ermöglichen eine nahtlose JSON-Verarbeitung.
NodaTime ist eine ausgereifte, gut dokumentierte Bibliothek, die Zeitverarbeitung in .NET auf ein neues Niveau hebt. Sie macht implizite Annahmen explizit, reduziert typische Bugs und verbessert die Testbarkeit. Besonders für internationale Systeme, medizinische Anwendungen oder Buchungsplattformen ist sie empfehlenswert. Wer mit komplexer Zeitlogik in .NET arbeitet, sollte NodaTime kennen.
https://github.com/nodatime/nodatime
https://github.com/nodatime/nodatime.serialization
Das vollständige Codebeispiel aus diesem Artikel findest du auf GitHub unter: https://github.com/Nutzlastkaktus8/NodaTimeBeispiele.git

Unser Geschäftsführer Tibor Csizmadia und unser Kundenbetreuer Jens Walter stehen Ihnen persönlich zur Verfügung. Profitieren Sie von unserer langjährigen Erfahrung und erhalten Sie eine kompetente Beratung in einem unverbindlichen Austausch.