Ich verwende DateTime.ToLocalTime()
, um Daten von UTC in lokale Zeit umzurechnen. Meine Zeitzone ist GMT + 1 (Belgrad, Budapest, Lubjna ...), sie ist in Windows-Einstellungen (XP) richtig eingestellt.
Am letzten Wochenende in unserer Zeitzone sind wir in Winterzeit in Sommerzeit gewechselt, dh wir haben die Ortszeit um eine Stunde zurückgestellt.
Wie ich sehe, verhält sich die ToLocalTime-Methode von diesem Moment an seltsam. Wenn ich es verwende, um Daten zu konvertieren, die sich nach dieser Winterzeit ändern, funktioniert es großartig, so:
%Vor% utcDate1.ToLocalTime()
Wert ist: 2011.11.02. 10:00:00
ist korrekt
Burt, wenn ich ein Datum vor dieser Änderung (z. B. ein Datum von Sommerzeit) konvertieren möchte, gibt es einen schlechten Wert wie folgt zurück:
%Vor% utcDate2.ToLocalTime()
Wert ist: 2011.10.23. 10:00:00
Es ist falsch Es sollte 2011.10.23 sein. 11:00:00
Was soll ich tun, um korrekte Werte zu erhalten? Wie sollte ich ToLocalTime verwenden, die auch die Winter- / Sommerzeit anpasst?
Auf Windows XP-Systemen erkennt die ToLocalTime-Methode nur die aktuelle Anpassungsregel bei der Konvertierung von UTC in Ortszeit. Als ein Ergebnis, Konvertierungen für Zeiträume vor der aktuellen Anpassungsregel in Kraft trat möglicherweise nicht genau den Unterschied zwischen UTC und Ortszeit.
Sie müssen also einen anderen Weg finden, es herauszufinden.
Meine Vermutung ist, dass die Zeitzonendaten auf Ihrem System möglicherweise veraltet sind - oder aufgrund der Einschränkung, die jsobo erwähnt hat.
Eine Option, die Sie möglicherweise (vorsichtig) verfolgen möchten, ist die Verwendung meiner Datum / Zeit-API, Noda Zeit . Dies hat die Konvertierung zu / from Noda Time ist noch nicht "v1.0-ready", aber hauptsächlich wegen ein paar fehlenden Features. Ob Sie das Risiko eines nicht-v1.0-Open-Source-Projekts eingehen wollen oder nicht, liegt natürlich bei Ihnen, aber ich würde mich sehr freuen, Ihnen bei allen Problemen zu helfen, mit denen Sie zu tun haben. (Ich versuche wirklich, Anwendungsfälle im wirklichen Leben zu finden. Wenn also Funktionen fehlen, die Sie brauchen, kann ich sie wahrscheinlich im Vorgriff auf andere implementieren, die dasselbe brauchen.) Noda Time verwendet die zoneinfo-Zeitzonendatenbank, nicht die in Windows integrierte Zone, daher sollte es nicht die gleichen Probleme haben. Um zu überprüfen, würden Sie Code wie folgt verwenden: DateTime
, so dass %
.NET führt einige Berechnungen hinter den Kulissen durch. Ich empfehle Ihnen, diesen Artikel von Raymond Chen über implizite Zeitzonen-Conversions zu lesen.