.NET TimeZoneInfo неправильно о летнее время - PullRequest
4 голосов
/ 14 февраля 2011

Может кто-нибудь помочь разобраться в этом. Класс 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

Ответы [ 3 ]

5 голосов
/ 14 февраля 2011

См .: TimeZoneInfo.IsDaylightSaving

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

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

TimeZoneInfo.Метод GetAmbiguousTimeOffsets

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

4 голосов
/ 13 октября 2013

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

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 результат имеет неопределенный вид, поэтому он проверял правила местного часового пояса, а не восточного часового пояса.

1 голос
/ 20 августа 2012

TimeZoneInfo.GetUtcOffset(DateTime)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...