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.

War es hilfreich?

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:

  1. Holen Sie sich den aktuellen Zeitpunkt:

    // Instant now = SystemClock.Instance.Now;               // NodaTime 1.x
    Instant now = SystemClock.Instance.GetCurrentInstant();  // NodaTime 2.x
    
  2. Rufen Sie die Zeitzone des Systems ab.(Dies ist die bevorzugte Syntax)

    DateTimeZone tz = DateTimeZoneProviders.Bcl.GetSystemDefault();
    
  3. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top