Краткий ответ
TimeZoneInfo.SupportsDaylightSavingTime
учитывает все данные о часовых поясах, доступные в системе, а не только данные текущего года. Как в Argentina Standard Time
, так и Altai Standard Time
существуют периоды, когда DST действовал, в течение периодов времени, которые Windows отслеживает для них.
Более длинный ответ
Документация для TimeZoneInfo.SupportsDaylightSavingTime
(с которой вы уже связались в своем вопросе) объясняет:
Получает значение указание на наличие в часовом поясе правил перехода на летнее время.
blockquote>Что немного менее понятно, так это то, что он имеет в виду конкретно
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 год.Даже не расшифровывая данные, мы можем видеть, что между годами были различия. Посмотрите на timeanddate.com здесь дает нам детали:
Похоже, что летнее время было в силе для летних сезонов 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
Таким образом, это подходит для
1147 То же самое можно найти и на Алтае. Windows отслеживает данные с 2010 года, и DST существовал в 2010 году .TimeZoneInfo.SupportsDaylightSavingTime
, чтобы вернутьTrue
, потому что действительно есть действительные даты, которые были в летнее время для этого часового пояса.
Обратите внимание, что оно также имеет изменения к своему стандартному времени в 2014 году и снова в 2016 году. Это еще одна причина того, что Правило корректировки может существовать. К сожалению, в Windows нет способа смоделировать это без использования переходов, помеченных как «начало DST» или «конец DST». Таким образом, некоторая часть этих лет вернется
True
изIsDaylightSavingTime
, даже если ни одна из сторон перехода не считалась переходом на летнее время. Это известная проблема с часовыми поясами в Windows. Это компромисс, который гарантирует, что используется правильное смещение UTC, даже если переход предназначен для изменения стандартного времени вместо перехода на летнее время.Если вам абсолютно необходимо знать, был ли переход связан с DST или нет, вы можете вместо этого использовать данные часового пояса IANA через библиотеку Noda Time . Свойство
ZoneInterval.Savings
скажет вам это. Однако, , это говорит о «постоянном переходе на летнее время». Даже в базе данных IANA они обычно рассматриваются как изменения стандартного времени, а не истинного перехода на летнее время. Таким образом, вы, вероятно, найдете случаи, когда кто-то может сказать: «Мы постоянно принимаем летнее время», но данные не совпадают.Относительно вашего последнего вопроса:
Как я могу убедиться, что у меня есть последние обновления DST / TZ от Microsoft, помимо того, что я объяснил выше?
blockquote>Достаточно просто убедиться, что вы используете Центр обновления Windows. Все обновления DST / TZ, перечисленные на сайте сообщества, развернуты с регулярными обновлениями для всех поддерживаемых версий Windows, независимо от того, в каком часовом поясе вы находитесь.