TimeZoneInfo SupportsDaylightSavingTime не возвращает то, что я ожидаю, почему?

2
задан Norcino 5 March 2019 в 19:56
поделиться

1 ответ

Краткий ответ

TimeZoneInfo.SupportsDaylightSavingTime учитывает все данные о часовых поясах, доступные в системе, а не только данные текущего года. Как в Argentina Standard Time, так и Altai Standard Time существуют периоды, когда DST действовал, в течение периодов времени, которые Windows отслеживает для них.


Более длинный ответ

Документация для TimeZoneInfo.SupportsDaylightSavingTime (с которой вы уже связались в своем вопросе) объясняет:

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

Что немного менее понятно, так это то, что он имеет в виду конкретно TimeZoneInfo.AdjustmentRule объекты, возвращаемые методом TimeZoneInfo.GetAdjustmentRules, и что это все [ 1156] правила в системе, а не только на текущий год.

Политика Microsoft гласит, что Windows отслеживает все изменения, начиная с 2010 года. Однако некоторые часовые пояса (например, для Аргентины) уже отслеживали изменения до того, как была написана политика, поэтому в некоторых случаях вы увидите более ранние данные.

В реестре Windows вы можете найти все данные о часовых поясах, о которых знает система, по следующему ключу:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

Каждое из значений TimeZoneInfo.Id соответствует подразделу этого раздела. и правила корректировки (если таковые имеются) будут в соответствии с Dynamic DST в соответствии с этим.

Для Argentina Standard Time\Dynamic DST мы находим данные с 2006 по 2010 год.

image

Даже не расшифровывая данные, мы можем видеть, что между годами были различия. Посмотрите на timeanddate.com здесь дает нам детали:

image

Похоже, что летнее время было в силе для летних сезонов 2007-08 и 2008-09 гг. (У Аргентины, находящейся в южном полушарии, лето разбито на два года.)

Действительно, мы можем видеть это из .NET:

var tz = TimeZoneInfo.FindSystemTimeZoneById("Argentina Standard Time");
var dt = new DateTime(2008, 1, 1);
var dst = tz.IsDaylightSavingTime(dt); // True

Таким образом, это подходит для TimeZoneInfo.SupportsDaylightSavingTime, чтобы вернуть True, потому что действительно есть действительные даты, которые были в летнее время для этого часового пояса.

1147 То же самое можно найти и на Алтае. Windows отслеживает данные с 2010 года, и DST существовал в 2010 году .

image

Обратите внимание, что оно также имеет изменения к своему стандартному времени в 2014 году и снова в 2016 году. Это еще одна причина того, что Правило корректировки может существовать. К сожалению, в Windows нет способа смоделировать это без использования переходов, помеченных как «начало DST» или «конец DST». Таким образом, некоторая часть этих лет вернется True из IsDaylightSavingTime, даже если ни одна из сторон перехода не считалась переходом на летнее время. Это известная проблема с часовыми поясами в Windows. Это компромисс, который гарантирует, что используется правильное смещение UTC, даже если переход предназначен для изменения стандартного времени вместо перехода на летнее время.

Если вам абсолютно необходимо знать, был ли переход связан с DST или нет, вы можете вместо этого использовать данные часового пояса IANA через библиотеку Noda Time . Свойство ZoneInterval.Savings скажет вам это. Однако, , это говорит о «постоянном переходе на летнее время». Даже в базе данных IANA они обычно рассматриваются как изменения стандартного времени, а не истинного перехода на летнее время. Таким образом, вы, вероятно, найдете случаи, когда кто-то может сказать: «Мы постоянно принимаем летнее время», но данные не совпадают.

Относительно вашего последнего вопроса:

Как я могу убедиться, что у меня есть последние обновления DST / TZ от Microsoft, помимо того, что я объяснил выше?

Достаточно просто убедиться, что вы используете Центр обновления Windows. Все обновления DST / TZ, перечисленные на сайте сообщества, развернуты с регулярными обновлениями для всех поддерживаемых версий Windows, независимо от того, в каком часовом поясе вы находитесь.

0
ответ дан Matt Johnson 5 March 2019 в 19:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: