DateTime.ToLocalTime() im winter/Sommer Zeit
Ich bin mit DateTime.ToLocalTime()
zu konvertieren, Daten von UTC in die lokale Zeit. Meine Zeitzone ist GMT+1(Belgrad, Budapest, Lubjna...), es ist richtig eingestellt in den Einstellungen von Windows (XP).
Letztes Wochenende in unserer Zeitzone wechselten wir auf den winter-auf Sommerzeit, das bedeutet, wir legen zurück, die lokale Zeit um eine Stunde.
So wie ich das sehe ToLocalTime Methode verhält sich merkwürdig aus, dass moment. Wenn ich es verwenden, um konvertieren von Datumsangaben, die sind nach diesem winter mal ändern, es funktioniert großartig, wie diese:
var utcDate2 = new DateTime(2011, 11, 2, 9, 0, 0,DateTimeKind.Utc);
utcDate1.ToLocalTime()
Wert ist: 2011.11.02. 10:00:00
es ist richtig
Burt, wenn ich will, um zu konvertieren ein Datum vor dieser änderung (z.B. Datum, ab Sommer) es gibt wieder einen schlechten Wert wie diese:
var utcDate1 = new DateTime(2011, 10, 23, 9, 0, 0,DateTimeKind.Utc);
utcDate2.ToLocalTime()
Wert ist: 2011.10.23. 10:00:00
es ist falsch, Es sollte 2011.10.23. 11:00:00
Was muss ich tun, um die richtigen Werte? Wie soll ich ToLocalTime, dass auch einstellen winter - /Sommerzeit?
- Es ist überhaupt nicht klar, was falsch ist - Sie haben gezeigt, dass die Schaffung von zwei UTC-Datum und Zeiten, aber nicht, was passiert, wenn Sie Sie konvertieren, um die lokale Zeit. Bitte geben Sie eine kurze, aber vollständige Programm, das das problem veranschaulicht.
- Sorry Leute, ich aktualisiert, einige Strg+c, Strg+v problem
- Es gibt einen Unterschied von 7 Tagen zwischen Ihrem zwei Beispiele. Was genau Fragen Sie? Da haben Sie schon angepasst, Ihre lokalen Uhren müssen Sie die lokale Zeit ein. Ich glaube nicht, dass ist UTC Sommerzeit bewusst, es ist ein DST-version, die Sie möglicherweise nutzen möchten, je nachdem, ob Sommerzeit angewendet werden soll, die lokal oder nicht. Dein zweites Beispiel ist eigentlich korrekt nach den aktuellen DST-Regeln, die auf Ihrem computer.
- Sie wollen bestimmen, was die lokalen datetime gewesen wäre, an einem Punkt vor des Tages Licht die Einsparungen wie shift. Das problem ist die Bibliothek nur wird die Verschiebung mit der aktuellen Regeln im Affekt "HEUTE"...
- Ramhound, erste date im Sommer Zeit des Jahres, der zweite im winter Zeit des Jahres.
- Beachten Sie, dass es einen Unterschied zwischen den aktuellen Regeln und den aktuellen Stand. Die Bibliothek verwendet die aktuellen Regeln, aber es nutzt der Staat das Datum, das Sie konvertieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx
So müssen Sie einen anderen Weg finden, um es herauszufinden.
Meine Vermutung ist, dass das time zone data auf Ihrem system kann veraltet sein - oder es ist aufgrund der Beschränkung jsobo erwähnt.
Eine option, die Sie könnte wollen (vorsichtig) betreiben, ist die Verwendung von Datum/Zeit-API, Noda Zeit. Dies hat die Umstellung auf/von
DateTime
so dass Sie könnte VerwendungDateTime
an anderer Stelle in Ihrem code, obwohl ich natürlich glaube, dein code wäre übersichtlicher, wenn Sie verwendet Noda Zeit überall 🙂Noda Zeit ist nicht "v1.0-ready", aber vor allem, weil von ein paar fehlenden Funktionen. Ob Sie bereit sind, das Risiko einer nicht-v1.0 open-source-Projekt ist oder nicht, ist bis zu Ihnen, natürlich, aber ich würde sehr glücklich sein, zu helfen, mit allen Fragen, die Sie laufen. (Ich bin wirklich versucht zu finden, real-life use cases, also, wenn es irgendwelche fehlenden features, die Sie benötigen, kann ich auch in der Lage sein, um Sie zu implementieren, in der Erwartung, andere brauchen die gleiche Sache.)
Noda Time nutzt die zoneinfo Zeitzone-Datenbank, nicht die, die in Windows integriert, also sollte es nicht die gleichen Probleme haben.
Zu überprüfen, verwenden Sie ähnlichen code wie diesen:
Ich die gleiche Zeit-zone, und wenn ich es versuche bekomme ich die richtigen Werte:
Ausgabe:
.NET hat einige Berechnungen hinter den kulissen. Ich empfehle die Lektüre dieser Artikel von Raymond Chen über implizite Zeitzone Konvertierungen.