Wie funktioniert DateTime.ToUniversalTime() arbeiten?
Wie erfolgt die Umrechnung zu UTC aus der standard - DateTime
- format arbeiten?
Genauer gesagt, wenn ich eine DateTime
Objekt in einem Zeit-zone, und dann wechseln Sie zu einer anderen Zeitzone und führen ToUniversalTime()
auf es, wie funktioniert es wissen, der Umbau richtig gemacht wurde, und dass die Zeit immer noch richtig dargestellt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine implizite Zeitzone, befestigt an einem
DateTime
Objekt. Wenn SieToUniversalTime()
auf, es verwendet die Zeitzone der Kontext, in dem der code ausgeführt wird.Zum Beispiel, wenn ich eine
DateTime
aus der Epoche der 1/1/1970, es gibt mir die gleichenDateTime
Objekt, egal wo in der Welt ich bin.Wenn ich
ToUniversalTime()
auf, wenn ich die Ausführung des Codes in Greenwich, dann bekomme ich die gleiche Zeit. Wenn ich es tun, während ich Lebe in Vancouver, dann bekomme ich einen offset -DateTime
Objekt von -8 Stunden.Dies ist, warum es wichtig ist zur Zeit speichern die entsprechenden Informationen in Ihrer Datenbank als UTC-Zeiten, wenn Sie brauchen, um jede Art von Datums-Konvertierung oder der Lokalisierung. Überlegen Sie, ob Ihre codebase verschoben habe, um eine server-Einrichtung in eine andere Zeitzone 😉
Edit: Hinweis von Joel Antwort -
DateTime
Objekte standardmäßig sind typisiert alsDateTimeKind.Local
. Wenn Sie parse ein Datum, und legen Sie es alsDateTimeKind.Utc
, dannToUniversalTime()
führt keine Konvertierung.Und hier ist ein Artikel über "Best Practices Codierung mit Datum Zeiten", und ein Artikel auf Konvertieren von DateTimes mit .Net.
Zunächst prüft es, ob die
Kind
desDateTime
bekannt ist UTC bereits. Wenn dem so ist, gibt es das gleiche Wert.Ansonsten, ist es davon ausgegangen, dass eine lokale Zeit - das ist lokal auf dem computer ausgeführt wird, auf, und insbesondere in der Zeitzone, die der computer verwendet wurde, wenn einige private Anwesen wurde zunächst verzögert initialisiert. Das heißt, wenn Sie die Zeitzone ändern nach Ihre Anwendung gestartet wurde, gibt es eine gute chance, es wird noch mit dem alten.
Zeit-zone enthält genug Informationen zum konvertieren einer lokalen Zeit zur UTC-Zeit oder Umgekehrt, obwohl es gibt Zeiten, dass das missverständlich oder ungültig. (Es sind lokale Zeiten, die doppelt vorkommen, und lokale Zeiten, die kommen nie durch die Sommerzeit.) Die Regeln für den Umgang mit diesen Fällen angegeben werden, in die Dokumentation:
Ist der Rückgabewert ein
Kind
vonDateTimeKind.Utc
, so dass, wenn Sie nennenToUniveralTime
auf, dass es nicht mehr gelten das wieder ausgleichen. (Dies ist eine große Verbesserung gegenüber .NET 1.1!)Wenn Sie möchten, dass eine nicht-lokale Zeitzone, die Sie verwenden sollten
TimeZoneInfo
, die eingeführt wurde .NET 3.5 (gibt es hacky-Lösungen für die früheren Versionen, aber Sie sind nicht schön). Darstellen, einen Augenblick in der Zeit, sollten Sie erwägen,DateTimeOffset
, die eingeführt wurde .NET-2.0SP1, .NET3.0SP1 und .NET 3.5. Jedoch, dass immer noch nicht über eine tatsächliche Zeit-zone zugeordnet - nur einen offset von UTC. Das bedeutet, dass Sie nicht wissen, was die lokale Zeit wird eine Stunde später - beispielsweise bei der Sommerzeit-Regeln können variieren zwischen den Zeitzonen, die passiert ist, die Verwendung der gleichen offset für den bestimmten Moment.TimeZoneInfo
ist darauf ausgelegt, die historischen und zukünftigen Regeln berücksichtigen, im Gegensatz zuZeitzone
, das ist etwas zu simpel.Grundsätzlich die Unterstützung .NET 3.5 ist viel besser als es war, aber lässt noch etwas zu wünschen übrig für die richtige Kalender-Arithmetik. Wer Lust Portierung Joda Time zu .NET? 😉
Was @womp sagte, mit dem Zusatz, dass es überprüft die DateTime ist eine Art Eigenschaft, um zu sehen, ob es vielleicht bereits ein UTC-Datum.
DateTime.ToUniversalTime entfernt die Zeitzone offset der lokalen Zeitzone zu normalisieren DateTime in UTC. Wenn Sie dann die DateTime.ToLocalTime auf den normalisierten Wert in einer anderen Zeitzone, timezone-offset der Zeitzone Hinzugefügt werden, um den normalisierten Wert für die korrekte Darstellung in dieser Zeitzone.