.NET TimeZoneInfo ошибается насчет летнего времени

Может ли кто-нибудь помочь разобраться в этом. Класс Microsoft TimeZoneInfo в 3.5 сообщает мне, что следующая дата по Гринвичу не соответствует летнему времени для восточного часового пояса, но это так.

// Get Eastern Timezone
TimeZoneInfo tzEasternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

// Convert to EST 
DateTime easternTime = TimeZoneInfo.ConvertTime(DateTime.Parse("2009-11-01T05:00:00Z"), tzEasternZone);

// Daylight saving IS in effect on this date, but Microsoft doesn't think so
Boolean isDaylight = easternTime.IsDaylightSavingTime();

Вот 2 веб-сайта, которые говорят, что это летнее время:
http://www.timeanddate.com/worldclock/converted.html?month=11&day=1&year=2009&hour=5&min=0&sec=0&p1=0&p2=198
http://www.timezoneconverter.com/cgi-bin/tzc.tzc


person Matt    schedule 14.02.2011    source источник
comment
на какой операционной системе вы это тестируете?   -  person x0n    schedule 14.02.2011


Ответы (3)


См. TimeZoneInfo.IsDaylightSaving

Поскольку метод TimeZoneInfo.IsDaylightSavingTime (DateTime) может возвращать false для неоднозначной даты и времени (то есть даты и времени, которые могут представлять либо стандартное время, либо летнее время в определенном часовом поясе), TimeZoneInfo. Метод IsAmbiguousTime (DateTime) можно связать с методом IsDaylightSavingTime (DateTime), чтобы определить, может ли время быть летним. Поскольку неоднозначное время может быть как летним, так и стандартным временем ...

Также вы можете посмотреть на это ...

Метод TimeZoneInfo.GetAmbiguousTimeOffsets

Возвращает информацию о возможных датах и ​​времени, которым могут быть сопоставлены неоднозначные дата и время.

person John Sobolewski    schedule 14.02.2011
comment
Мне так глупо думать, что функция IsDaylightSavingTime () сообщит мне, было ли время летнее. - person Matt; 14.02.2011
comment
Меня эта проблема тоже избила. Что именно неоднозначно в отношении того, указано ли время на летнее время или нет? В моем случае IsDaylightSavingTime возвращает значение False, когда должно быть True, а IsAmbiguousTime также имеет значение False. См. stackoverflow.com/questions/8356866/ - person ingredient_15939; 02.12.2011

Это будет работать:

TimeZoneInfo tzEasternZone = TimeZoneInfo.FindSystemTimeZoneById(
                                          "Eastern Standard Time");

DateTime utc = DateTime.Parse("2009-11-01T05:00:00Z",
                              CultureInfo.InvariantCulture,
                              DateTimeStyles.RoundtripKind);

bool isDaylight = tzEasternZone.IsDaylightSavingTime(utc);

Исходный код имел две проблемы:

  • Несмотря на то, что предоставлялось значение UTC, оно преобразовывалось в локальный вид в операторе Parse. Так что здесь может быть введена двусмысленность.

  • Метод IsDaylightTime в классе DateTime принимает местный часовой пояс, если тип является местным или не указан. После вызова ConvertTime результат имеет неопределенный вид, поэтому проверка проводилась по правилам местного часового пояса, а не восточного часового пояса.

person Matt Johnson-Pint    schedule 13.10.2013

TimeZoneInfo.GetUtcOffset(DateTime)

Правильно возвращает смещение с учетом летнего времени, если указанная дата находится внутри периода

person Andrew Harry    schedule 20.08.2012