TimeZoneInfo.Local vs TimeZoneInfo.FindSystemTimeZoneById

Ich habe mit dem gearbeitetDateTime undTimeZoneInfo Klassen und ich lief auf ein interessantes Ergebnis mit dem folgenden Code:

var dstStart = new DateTime(2013, 3, 10, 2, 0, 0, DateTimeKind.Local);
var result = TimeZoneInfo.Local.IsDaylightSavingTime(dstStart);

Das Ergebnis davon istFalse. Eigentlich hätte ich gedacht, dass es so wäreTrue (Die Sommerzeit beginnt am 10. März um 02:00 Uhr.)

Dann habe ich mit ähnlichem Code versuchtFindSystemTimeZoneById stattdessen:

var myTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var result = myTimeZone.IsDaylightSavingTime(dstStart);

Das Ergebnis ist überraschendTrue.

Ich habe dann überprüft, ob diese Objekte dieselbe Zeitzone darstellen:

myTimeZone.Id == TimeZoneInfo.Local.Id // returns True (Both are "Eastern Standard Time")

Meine Frage ist:Warum sind diese Ergebnisse unterschiedlich und was noch wichtiger ist, wie kann ich sie gleich machen?

Mein Computer ist definitiv in derEastern Standard Time Zeitzone

Mehr Informationen:

Ich habe die Uhr meines Computers erneut synchronisiert und eine Reihe von Tests durchgeführt, um die Uhr zu vergleichenTimeZoneInfo Objekt, das von jeder der oben genannten Methoden zurückgegeben wurde. Hier ist mein Testprogramm

var timeZoneFromLookup = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

var dstStart = new DateTime(2013, 3, 10, 2, 0, 0, DateTimeKind.Local);

// -- The following return true --

Console.WriteLine("Equal? {0}", TimeZoneInfo.Local.Equals(timeZoneFromLookup));

Console.WriteLine("Has Same Rules? {0}", TimeZoneInfo.Local.HasSameRules(timeZoneFromLookup));

Console.WriteLine("Same Id? {0}", TimeZoneInfo.Local.Id == timeZoneFromLookup.Id);

Console.WriteLine("Same Base UTC Offset? {0}", TimeZoneInfo.Local.BaseUtcOffset == timeZoneFromLookup.BaseUtcOffset);

Console.WriteLine("Same Daylight Name? {0}", TimeZoneInfo.Local.DaylightName == timeZoneFromLookup.DaylightName);

Console.WriteLine("Same Display Name? {0}", TimeZoneInfo.Local.DisplayName == timeZoneFromLookup.DisplayName);

Console.WriteLine("Same Standard Name? {0}", TimeZoneInfo.Local.StandardName == timeZoneFromLookup.StandardName);

Console.WriteLine("Same Support For DST? {0}", 
    TimeZoneInfo.Local.SupportsDaylightSavingTime == timeZoneFromLookup.SupportsDaylightSavingTime
);

Console.WriteLine("Same result as to whether date/time is ambiguous? {0}", 
    timeZoneFromLookup.IsAmbiguousTime(dstStart) == TimeZoneInfo.Local.IsAmbiguousTime(dstStart)
);

// -- The following return false --


Console.WriteLine("Same utc offset result? {0}", 
    timeZoneFromLookup.GetUtcOffset(dstStart) == TimeZoneInfo.Local.GetUtcOffset(dstStart)

);
Console.WriteLine("Same Conversion to UTC? {0}", 
    TimeZoneInfo.Local.GetUtcOffset(dstStart) == timeZoneFromLookup.GetUtcOffset(dstStart)
);

Console.WriteLine("Same result as to whether date/time is invalid? {0}", 
    timeZoneFromLookup.IsInvalidTime(dstStart) == TimeZoneInfo.Local.IsInvalidTime(dstStart)
);

Console.WriteLine("Same result as to whether date/time is DST? {0}", 
    timeZoneFromLookup.IsDaylightSavingTime(dstStart) == TimeZoneInfo.Local.IsDaylightSavingTime(dstStart)
);

Antworten auf die Frage(2)

Ihre Antwort auf die Frage