Abrufen der LocalDateTime des Systems in Noda Time
Frage
Was ist der idiomatische Weg, um die Zeit des Systems als? LocalDateTime
in der Noda-Zeit?Die direkteste Methode, die ich mir vorstellen könnte, wäre
var dt = DateTime.Now
LocalDateTime systemTime = new LocalDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute);
aber angesichts der Noda-Zeit Der gesamte Zweck besteht darin, DateTime durch etwas zu ersetzen, das eine schönere Semantik hat, Ich ging davon aus, dass es eine bevorzugte Methode als die zu verwendende gab DateTime
in der oben genannten Weise.Das Beste, was ich mir mithilfe der Einrichtungen von Noda einfallen lassen konnte, ist
var zone = NodaTime.TimeZones.BclDateTimeZone.ForSystemDefault();
LocalDateTime systemTime = SystemClock.Instance.Now.InZone(zone).LocalDateTime;
aber das scheint ziemlich ausführlich zu sein.
Lösung
Ihr zweites Beispiel zeigt genau, wie Sie dies tun würden.Es ist absichtlich ausführlich.Sehen Die Designphilosophie von Noda Time.
Betrachten Sie es in drei Teilen:
Holen Sie sich den aktuellen Zeitpunkt:
// Instant now = SystemClock.Instance.Now; // NodaTime 1.x Instant now = SystemClock.Instance.GetCurrentInstant(); // NodaTime 2.x
Rufen Sie die Zeitzone des Systems ab.(Dies ist die bevorzugte Syntax)
DateTimeZone tz = DateTimeZoneProviders.Bcl.GetSystemDefault();
Wenden Sie die Zeitzone auf den Zeitpunkt an:
ZonedDateTime zdt = now.InZone(tz);
Ihr letzter Schritt auf dem Weg zu einem LocalDateTime
ist trivial, aber seien Sie sich darüber im Klaren, dass Sie dabei jegliche Zeitzoneninformationen entfernen.„Lokal“ in NodaTime schon nicht bedeuten „lokal auf dem Computer, auf dem der Code ausgeführt wird“.(Mit anderen Worten, es ist nicht so DateTimeKind.Local
)
Weitere Dinge, über die Sie nachdenken sollten:
Möglicherweise möchten Sie die Uhr lieber mit dem abstrahieren
IClock
Schnittstelle:IClock clock = SystemClock.Instance; // Instant now = clock.Now; // NodaTime 1.x Instant now = clock.GetCurrentInstant(); // NodaTime 2.x
Dann können Sie die Uhr als Methodenparameter übergeben oder sie in Ihr bevorzugtes DI/IoC-Framework einfügen.(Autofac, Ninject, StructureMap, was auch immer ...).Der Vorteil ist, dass Sie dann a verwenden könnten
NodaTime.Testing.FakeClock
während Ihrer Unit-Tests.Sehen Unit-Tests mit Noda Time für mehr Details.Vielleicht möchten Sie auch lieber in der weitergeben
DateTimeZone
So können Sie Ihren Code überall ausführen, ohne an die Systemzeitzone gebunden zu sein.Dies ist für Serveranwendungen wichtig, für Desktop-/mobile Apps jedoch weniger.Wenn Sie andere Arbeiten haben, die IANA-Zeitzonen verwenden, oder wenn Sie den .NET Standard-Build von Noda Time verwenden, ändern Sie Schritt 2, um die zu verwenden
Tzdb
Anbieter:DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
Die TZDB-Zonen sind viel genauer als die BCL-Zonen.Noda Time ordnet in diesem ersten Aufruf die Windows-Zeitzone (BCL) Ihres Systems einer IANA-Zeitzone (TZDB) zu.
Wenn Sie neugierig sind, warum DateTime.Now
ist so kompakt, während Noda Time so ausführlich ist, versuchen Sie es mit der Dekompilierung DateTime.Now
oder schauen Sie sich die MS-Referenzquellen an.Sie werden sehen, dass unter der Haube im Wesentlichen die gleichen Schritte ausgeführt werden.