Instant.Jetzt für NodaTime
Ich versuche in den Griff zu bekommen mit dem Noda Zeit Rahmen von Jon Skeet (und andere).
Ich versuche zu speichern, das aktuelle jetzt(Sofort). Sofortige entstand aus einem langen Zecken, aber was ist der aktuelle nun die Anzahl der Ticks?
Ist es:
Instant now = new Instant(DateTime.Now.ToUniversalTime().Ticks);
Und oder?
Instant now = Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime());
Sind Sie gleichwertig, bin ich noch dabei das richtig?
PS, wenn Jon die Antwort ist diese - ich möchte vorschlagen, eine Sofortige.Jetzt Eigentum.
PS2-ich weiß, der Titel enthält einen tag, aber es würde nicht lassen Sie mich einen kurzen "Augenblick.Jetzt" Titel.
Instant.Now
wäre ein schlechter Fall für eine Immobilie, da es ändert sich der Wert von "hinter den kulissen" (BCL-leidet unter dem gleichen problem:DateTime.Now
).Instant.GetCurrent()
wäre viel besser, undnew Instant()
wohl das beste. Disclaimer: ich hatte null Einwirkung Noda Zeit.- Es ist nicht ein
Instant.GetCurrent()
- Siehe die Instant-docs. gibt Es auch nur ein Konstruktor für die SofortigeInstant(Int64)
- Aber in jedem Fall, die beiden Definitionen sind äquivalent.
Ticks
ist eine absolute Menge, es ändert sich nicht mit der Zeitzone. - wartet, Jon Skeet, zu zeigen, Antwort 100% passgenau, alle die upvotes und verlassen glücklich und zufrieden aus ChuckSavage
- Der Mangel an
Instant.Now
ist sehr bedächtig. Es ist nicht überprüfbar. Das ist, warumIClock
vorhanden ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe ein wenig Forschung, und es scheint, dass die NodaTime Weg ist, um die jetzt moment nach einem Uhr.
Wenn Sie möchten, um die aktuelle Zeit mit Hilfe der system-Uhr, nur mit
SystemClock.Instance.GetCurrentInstant()
.Jedoch, anstatt die
SystemClock.Instance
direkt im code, ist es vorzuziehen, dass Sie injizieren eineIClock
Abhängigkeit in Ihrem Zeit-bewusst-Klassen.Dies ermöglicht es Ihnen zu:
SystemClock.Instance
zur Laufzeit, so dass der code die richtige ZeitIClock
während unit-Tests zu ermöglichen, Sie zu zwicken die Zeit, wie benötigt wird, um zu testen, verschiedene Szenarien (wie der Zeit). Es gibt eine NodaTime.Prüfung Projekt, bietet solch eine Klasse, genanntFakeClock
.Ich finde dies sehr nützlich. Ich denke, dass so etwas wie
new Instant()
oderInstant.Now
Rückgabe der aktuellen Zeit würde es leichter machen, zu fest Verwendungen vonSystemClock
unter der Decke, daher fehlt die Tests den Vorteil, dass NodaTime bietet.Für weitere Informationen über unit-testing mit NodaTime, siehe dieser link.
Bezüglich Ihrer code-Beispielen: Sie sind nicht gleichwertig.
Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime())
wird in der Tat der gegenwärtige Augenblick in UTC.new Instant(DateTime.Now.ToUniversalTime().Ticks)
geben Sie ein Falsches Datum weit in der Zukunft, da die BCL istDateTime.Zecken
stellt die Anzahl der ticks seit1/1/0001
, und NodaTime istSofortige.Zecken
stellt die Anzahl der ticks seit1/1/1970
(siehe die Bemerkung hier).SystemClock.Jetzt
gibt die aktuelle Zeit als einenInstant
Wert:Aber vielleicht möchten Sie beachten Sie die Hinweise in der Dokumentation für die
IClock
Schnittstelle:Als einfaches Beispiel angenommen, Sie haben eine
Logger
Klasse, die Bedürfnisse der aktuellen Zeit. Statt den Zugriff aufSystemClock
direkt, verwenden Sie eineIClock
Instanz, die geliefert über seinen Konstruktor:Beim instanziieren eines
Logger
in Ihrer Produktion-Codes, die Sie geben können, esSystemClock.Instance
. Aber in einem unit-test für dieLogger
Klasse, Sie können esFakeClock
.SystemClock
?SystemClock
, aber das bedeutet nicht, dass Sie tatsächlich haben, um ReferenzSystemClock
überall müssen Sie die aktuelle Zeit. Ich habe ein einfaches Beispiel zu meiner Antwort.FakeClock
geholfen, es klarzustellen.