2013-11-19 3 views
2

Я недавно обновил свой os с помощью .net 4.5 framework и скомпилировал все мои приложения, используя его. , к сожалению, некоторые из автоматических тестов, которые я написал, теперь терпят неудачу в конструкциях Assert, касающихся типов DateTime.Ошибка TimeZoneInfo в .net 4.5

После глубокого анализа я оказался этот:

в .net 4.0

DateTime dateUsing40 = new DateTime(2011, 4, 7); // ticks 634377312000000000  
dateUsing40.ToUniversalTime(); //ticks **634377240000000000 

bool isDaylightST = dateUsing40.IsDaylightSavingTime(); // returns **true 

в .net 4.5

DateTime dateUsing45 = new DateTime(2011, 4, 7); // ticks 634377312000000000 
dateUsing45.ToUniversalTime(); //ticks **634377276000000000  
bool isDaylightST = dateUsing45.IsDaylightSavingTime(); // returns **false 

System.Threading.Thread.CurrentThread.CurrentCulture является в обоих случаях {it-IT}

Фактически, дата, которую я использую, находится в диапазоне (итальянский, но также и для всех стран, которые используют WET), поэтому похоже, что в структуре существует (огромная) ошибка. однако я не нашел ничего полезного.

Я проверил в обеих машинах:

  • региональные настройки по-прежнему установлен на итальянском языке.
  • «Автоматическая настройка часов для перехода на летнее время».
  • открытие Региональные и настройки-> на вкладке Расположение -> текущее местоположение по-прежнему Италия.
  • ОС Windows 7 x64

РЕШИТЬ:

обновление базы изменилось значение в DynamicDaylightTimeDisabled к 1. Для того, чтобы решить эту проблему, это необходимо, чтобы превратить его в 0 и перезагрузки. Другой способ сделать это - использовать форму часового интерфейса.

+0

Используйте ['NodaTime'] (http://nodatime.org/). Класс .NET 'DateTime' имеет некоторые проблемы. –

+2

Здесь не воспроизводится. Вы уверены в 'CurrentCulture'. Были ли изменены региональные настройки Windows на компьютере .NET 4.5? –

+0

Я тоже не могу воспроизвести это. И использование моей собственной культуры (nl-BE), и it-IT. – Jensen

ответ

2

Проверьте значение var tziLocal = TimeZoneInfo.Local; (см. Ответ Шона) и его имущество Id.

Эквивалентное (я думаю), перейдите к PowerShell и написать:

Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation -Name TimeZoneKeyName 

и проверить значение TimeZoneKeyName Winreg "собственности". Get-ItemProperty можно укоротить до gp.

На основе экспериментов, то CurrentCulture, CurrentUICulture и RegionInfo.CurrentRegion являются не используется, для определения «местного времени».

Вместо этого, если вы перейдете к Windows, Панель управления → Часы, язык и область → Дата и время → вкладка Дата и время → секция Часовой пояс → кнопка Изменить часовой пояс ..., изменение этой зоны ,

Конечно, если реестр Windows, содержит неправильные настройки для Италии, как правило, ID "W. Europe Standard Time" (не "Romance Standard Time", не "Central European Standard Time"), на вашей машине, это будет проблемой.

+0

В пути к реестру HKEY_LOCAL_MACHINE -> SYSTEM -> CURRENTCONTROLSET -> CONTROL -> TIMEZONEINFORMATION timezoninfoKey настроен на исправление «W. Europe Standard Time», но я заметил, что ключ «DynamicDaylightTimeDisabled» установлен на «1» в машине 4.5 и «0 «в машине 4.0, хотя я изменил ее, и проблема не изменилась. – Riccardo

+0

У меня нет проблемы. Со мной «DynamicDaylightTimeDisabled» - «0», а «DaylightStart» - «00 00 03 00 05 00 02 00 00 00 00 00 00 00 00 00» (что, надеюсь, означает «последнее воскресенье марта»). –

+0

Что у вас есть в вашей машине? – Riccardo

2

Как насчет использования класса TimeZoneInfo?

DateTime dateUsing45 = new DateTime(2011, 4, 7); // ticks 634377312000000000 
dateUsing45.ToUniversalTime(); //ticks **634377276000000000  

TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); 
var isDaylightST = cstZone.IsDaylightSavingTime(dateUsing45);