Schamloser Stecker:
Verwenden Sie eine bessere Datums- und Uhrzeit-API
Die integrierten .NET-Datums- und Zeitbibliotheken sind fürchterlich schwer zu verwenden. Sie tun können Sie alles tun , was Sie brauchen, aber Sie können nicht ausdrücken , sich klar durch das Typsystem. DateTime
ist ein Chaos , DateTimeOffset
kann Sie in den Gedanken wiegen, dass Sie die Zeitzoneninformationen tatsächlich beibehalten, wenn Sie dies nicht tun, und TimeZoneInfo
zwingt Sie nicht dazu, über alles nachzudenken, was Sie in Betracht ziehen sollten.
Keines davon bietet eine gute Möglichkeit, "nur eine Tageszeit" oder "nur ein Datum" zu sagen, und sie unterscheiden auch nicht klar zwischen "Ortszeit" und "Zeit in einer bestimmten Zeitzone". Und wenn Sie einen anderen Kalender als den Gregorianischen verwenden möchten, müssen Sie Calendar
die ganze Zeit durch die Klasse gehen .
All dies ist der Grund, warum ich Noda Time erstelle - eine alternative Datums- und Zeitbibliothek, die auf einem Port der Joda Time "Engine" basiert, aber eine neue (und schlankere) API enthält.
Einige Punkte, über die Sie nachdenken sollten, die leicht zu übersehen sind, wenn Sie sich ihrer nicht bewusst sind:
- Das Zuordnen eines lokalen Datums / einer lokalen Uhrzeit zu einem Datum in einer bestimmten Zeitzone ist nicht so einfach, wie Sie vielleicht denken. Ein bestimmtes lokales Datum / eine bestimmte lokale Uhrzeit kann aufgrund von Sommerzeitübergängen einmal, zweimal (Mehrdeutigkeit) oder nullmal (übersprungen) auftreten
- Zeitzonen variieren historisch - mehr als
TimeZoneInfo
allgemein offengelegt werden kann. (Es wird keine Zeitzone unterstützt, deren Vorstellung von "Standardzeit" sich im Laufe der Zeit ändert oder die in die permanente Sommerzeit übergeht.)
- Selbst mit der zoneinfo-Datenbank sind Zeitzonen-IDs nicht unbedingt stabil. (CLDR spricht dies an; etwas, das ich hoffentlich in Noda Time unterstützen werde.)
- Textdarstellungen von Datum und Uhrzeit sind ein Albtraum, nicht nur in Bezug auf die Reihenfolge, sondern auch auf Datums-, Zeit- und seltsame Dinge wie Genitivmonatsnamen
- Der Beginn des Tages ist nicht immer Mitternacht - in Brasilien beispielsweise bewegt der Sommerzeitübergang im Frühling die Wanduhr von 23:59:59 Uhr auf 1 Uhr morgens
- In einigen Fällen (eine, die ich kenne) kann eine Zeitzone das Überspringen eines ganzen Tages erzwingen - der 30. Dezember 2011 ist in Samoa nicht aufgetreten! Ich vermute, die meisten Entwickler können diesen wahrscheinlich ignorieren, aber ...
- Wenn Sie einen anderen Kalender als den Gregorianischen verwenden, seien Sie vorsichtig und stellen Sie sicher, dass Sie wirklich wissen, wie Sie erwarten, dass er sich verhält.
Soweit spezifische Entwicklungspraktiken:
- Überlegen Sie, was Sie wirklich darstellen möchten. Ich gehe davon aus, dass der Hauptvorteil von Noda Time darin besteht, Entwickler zu zwingen, zwischen verschiedenen Typen zu wählen, um ihre Daten darzustellen. Machen Sie das richtig und alles andere ist einfacher.
- Unit Test alles, was Sie sich vorstellen können. Das hängt natürlich genau davon ab, was Ihr System tut, berücksichtigt jedoch insbesondere unterschiedliche Zeitzonen, was bei Sommerzeitübergängen passiert und natürlich Schaltjahre.
- Ich würde empfehlen, eine "uhrähnliche Schnittstelle" einzufügen - einen Dienst zum Anzeigen der aktuellen Uhrzeit - anstatt explizit aufzurufen
DateTime.Now
oder DateTime.UtcNow
; es macht den Unit-Test einfacher (machbar!)
- Wenn Sie mehrere Vorgänge mit "jetzt" ausführen, rufen Sie dieses Datum / diese Uhrzeit einmal ab und merken Sie sich dies, anstatt wiederholt "jetzt" anzufordern. Andernfalls kann sich der Wert zwischen den Aufrufen auf unglückliche Weise ändern.
- "Alles in UTC tun" ist auch nicht immer die Antwort - wenn ich wissen möchte, "wann genau" in zwei Wochen "in meiner lokalen Zeitzone auftritt?" dann muss ich das lokale Datum / die lokale Uhrzeit sowie die Zeitzone speichern .