2015-11-05 3 views
3

У меня очень странное поведение с TimeZoneInfo.ConvertTimeFromUtc. Как вы думаете, что это возвращает?TimeZoneInfo.ConvertTimeFromUtc возвращает неверный результат

var date = new DateTime(2000, 1, 1, 12, 0, 0); 
var dest = TimeZoneInfo.FindSystemTimeZoneById("Belarus Standard Time"); 
TimeZoneInfo.ConvertTimeFromUtc(date, dest); 

Беларусь Стандартное время - UTC + 3. И я ожидаю {01.01.2000 15:00:00}. Но я вижу следующее: enter image description here

WAT?

Это работало правильно несколько дней назад. Но сегодня я провел модульные тесты и заметил это. Перед запуском тестов я установил Visual Studio 2015. Что может случиться и почему? Как это исправить?

PS: Он работает правильно на другой машине.

+0

Вы действительно уверены? Это кажется странным. Он возвращает '{01.01.2000 15:00:00}' на меня. –

+0

@ SonerGönül, да, я уверен. Похоже, что после установки новой версии VS есть DLL с ошибкой. – Neshta

+0

Какова ваша среда? .Net Framework версии и версии Windows? –

ответ

2

Собственно, преобразование верно.

Хотя это правда, что Беларусь в настоящее время имеет часовой пояс для UTC + 3 в течение всего года, это только в том, что путь с 2012 года

До этого его стандартное смещение было UTC + 2 , и он наблюдал дневное время (ака «летнее время»), компенсирующее UTC + 3 с последнего воскресенья марта до последнего воскресенья октября. Это изменение было принято, оставаясь в летнее время в 2011 году и оставаясь там навсегда, а не отступать.

You can see the history of changes here.

При использовании "Belarus Standard Time" часового пояса, информация для этой зоны извлекается из данных в реестре по следующему адресу:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Belarus Standard Time 

Там вы увидите основную информацию, а также подраздел называется Dynamic DST, который содержит изменения за год. Вы заметите, что Windows, имеет три записи для этой зоны:

  • One за 2010 год и до, которые чередуются между стандартным и светлым временем суток
  • Один за 2011 год, что делает одно изменение времени дневного света без возврата стандартное время
  • Один за 2012 год и больше, что фиксируется в зимнее время с новой базой смещения

Заметим, что это упрощение full IANA TZDB entry of "Europe/Minsk", который отслеживает другие изменения в 1992 году и ранее. Windows не знает об этих изменениях, поэтому, если вы собираетесь работать с историческими датами в этом часовом поясе, вам следует использовать Noda Time вместо TimeZoneInfo, так как Noda Time поддерживает часовые пояса TZDB. Кроме того, обратите внимание, что поскольку данные моделируются в Windows в 2011 году и ранее имеют другое базовое смещение, чем правило 2012 года и переадресация, на него влияет проблема, описанная в KB2012229. Раздел статуса этой статьи устарел, поскольку проблема была решена с помощью .NET 4.6. Даже если вы нацеливаете .NET 3.5 на .NET 4.5.2, если .NET 4.6 установлен на машине вообще, тогда он будет вести себя корректно. Если .NET 4.6 не установлен на машине, он применит неверное базовое смещение для Беларуси в 2011, 2010 и предыдущие годы.(Вот почему SonerGönül получил время 15:00, упомянутое в комментариях к вопросу.)

+0

Теперь я понял. Спасибо за разъяснение. –

Смежные вопросы