Wie gehst du mit 'Ambiguous Time' in .net um?

8

Ich muss einen 'DateTime'-Wert von verschiedenen Zeitzonen in UTC und umgekehrt umwandeln. Ich verwende TimeZoneInfo, um dies zu tun. Das Problem tritt jedoch auf, wenn die Zeitumstellung "Tageslicht sparen" eintritt.

Zum Beispiel in diesem Jahr, das nächste Mal findet die Zeitumstellung um 2 Uhr [CDT] am 3. November statt. Am 3. November wird also 1 Uhr morgens [CDT] in 6 Uhr umgewandelt und wenn die nächste Stunde passiert, bekommen wir 1 Uhr [jetzt seine CST] wieder und es wird auch zu 6AM konvertiert. Ich habe den Code auf dieser Seite ausprobiert, aber es hat nicht funktioniert. Ich sage nichts, wie ich mit diesem Problem umgehen soll. So, wie man mit diesem Problem umgeht ???

Bearbeiten:

Ich habe versucht, NodaTime und wenn ich die Konvertierung wie

%Vor%

es wirft AmbiguousTimeException. Das ist gut und ich kann dies auch mit TimeZoneInfo tun. Aber woher weiß ich, welchen LocalTime-Wert ich auswählen muss?

Bearbeiten 2:

Hier ist der Link für das Chat-Gespräch mit Matt.

    
usp 07.06.2013, 21:59
quelle

1 Antwort

9

Wenn Sie nur eine Ortszeit haben und diese Zeit nicht eindeutig ist, können Sie sie nicht in einen genauen UTC-Zeitpunkt umwandeln. Deshalb sagen wir "mehrdeutig".

Beispielsweise in der US-Central-Zeitzone, die den IANA-Zonennamen America/Chicago und die Windows-Zonen-ID Central Standard Time enthält - sowohl für die "Zentrale Standardzeit" als auch für die "Zentrale Sommerzeit". Wenn alles, was ich weiß, ist, dass es der 3. November 2013 um 1:00 Uhr morgens ist, dann ist diese Zeit mehrdeutig und es gibt absolut keine Möglichkeit zu wissen, ob dies die erste Instanz von 1:00 war, die in der Central Daylight Time war (UTC-5) oder zentrale Standardzeit (UTC-6).

Unterschiedliche Plattformen machen unterschiedliche Dinge, wenn sie gebeten werden, eine mehrdeutige Zeit in UTC umzuwandeln. Einige gehen mit der ersten Instanz, die normalerweise die Sommerzeit ist. Einige gehen mit der Standardzeit, die normalerweise die zweite Instanz ist. Einige werfen eine Ausnahme, und einige (wie NodaTime) geben Ihnen die Wahl, was Sie wollen.

Beginnen wir mit TimeZoneInfo first.

%Vor%

Wie Sie sehen, hat .net sich für die "Standard" -Zeit entschieden, die UTC-6 ist. (Hinzufügen von 6 Stunden bis 1 Uhr morgens bringt Sie bis 7 Uhr morgens). Es gab keine Warnung, dass die Zeit mehrdeutig war. Sie könnten sich selbst überprüft haben, so:

%Vor%

Aber es gibt nichts, um dies durchzusetzen. Sie müssen es selbst überprüfen.

Die einzige Möglichkeit, keine Mehrdeutigkeiten zu haben, besteht darin, nicht den Typ DateTime zu verwenden. Stattdessen können Sie DateTimeOffset verwenden. Beobachte:

%Vor%

Vergleiche das nun mit NodaTime:

%Vor%

Wie Sie sehen können, gibt es viele Möglichkeiten. Alle sind gültig, es hängt nur davon ab, was Sie tun möchten.

Wenn Sie Mehrdeutigkeiten vollständig vermeiden möchten, behalten Sie immer DateTimeOffset bei, oder verwenden Sie bei Verwendung von NodaTime ZonedDateTime oder OffsetDateTime . Wenn Sie DateTime oder LocalDateTime verwenden, können Zweideutigkeiten nicht vermieden werden.

    
Matt Johnson 08.06.2013, 00:03
quelle

Tags und Links