Erstens prüft sie, ob die Kind
der DateTime
ist bereits als UTC bekannt. Ist dies der Fall, wird derselbe Wert zurückgegeben.
Andernfalls wird davon ausgegangen, dass es sich um eine lokale Zeit handelt, d. h. um eine lokale Zeit des Computers, auf dem das Programm läuft, und zwar in der Zeitzone, die der Computer verwendet hat, als er zum ersten Mal mit einer privaten Eigenschaft initialisiert wurde. Das bedeutet, wenn Sie die Zeitzone ändern nach Ihre Anwendung gestartet wurde, ist die Wahrscheinlichkeit groß, dass sie noch die alte Version verwendet.
Die Zeitzone enthält genügend Informationen, um eine Ortszeit in eine UTC-Zeit oder umgekehrt zu konvertieren, obwohl dies manchmal nicht eindeutig oder ungültig ist. (Es gibt Ortszeiten, die zweimal vorkommen, und Ortszeiten, die wegen der Sommerzeit nie vorkommen.) Die Regeln für die Behandlung dieser Fälle sind in die Dokumentation :
Wenn das Datum und die Uhrzeit insta eine mehrdeutige Zeit, nimmt diese Methode an dass es sich um eine Standardzeit handelt. (Eine mehrdeutige Zeit ist eine, die entweder [ ] Sommerzeit in der lokalen Zeitzone Zone zugeordnet werden kann.) Wenn der Wert der Datums- und Zeitinstanz Wert eine ungültige Zeit ist, subtrahiert diese Methode einfach die lokale Zeit von der dem UTC-Offset der lokalen Zeitzone, um UTC zurückzugeben. (Eine ungültige Zeit ist eine die nicht existiert, weil die Anwendung der Sommerzeit Anpassungsregeln nicht existiert.)
Der zurückgegebene Wert hat eine Kind
von DateTimeKind.Utc
Wenn Sie also anrufen ToUniveralTime
dann wird der Versatz nicht mehr angewendet. (Dies ist eine enorme Verbesserung gegenüber .NET 1.1!)
Wenn Sie eine nicht-lokale Zeitzone wünschen, sollten Sie TimeZoneInfo
die in .NET 3.5 eingeführt wurde (für frühere Versionen gibt es Hacking-Lösungen, aber die sind nicht schön). Um einen Moment in der Zeit darzustellen, sollten Sie die Verwendung von DateTimeOffset
die in .NET 2.0SP1, .NET3.0SP1 und .NET 3.5 eingeführt wurde. Allerdings ist damit immer noch keine tatsächliche Zeitzone verbunden, sondern nur eine Abweichung von der UTC. Das bedeutet, dass Sie nicht wissen, wie die Ortszeit beispielsweise eine Stunde später sein wird - die Sommerzeitregeln können zwischen den Zeitzonen variieren, die zufällig denselben Versatz für diesen bestimmten Zeitpunkt verwenden. TimeZoneInfo
ist so konzipiert, dass historische und künftige Regeln berücksichtigt werden, im Gegensatz zu TimeZone
was etwas vereinfacht ist.
Grundsätzlich ist die Unterstützung in .NET 3.5 viel besser als früher, lässt aber immer noch etwas zu wünschen übrig, was die korrekte Kalenderarithmetik angeht. Hat jemand Lust zu portieren Joda Zeit zu .NET? ;)