.net 4.5中的TimeZoneInfo错误

时间:2013-11-19 11:53:59

标签: c# asp.net .net datetime

我最近使用.net 4.5框架更新了我的操作系统并使用它编译了我的所有应用程序。 遗憾的是,我现在编写的一些自动测试在关于DateTime类型的Assert结构上失败了。

经过深入分析后,我发现了这个:

in .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的国家/地区)的日光时间范围,所以看起来框架中有一个(巨大的)错误。但是我找不到任何有用的东西。

我在两台机器上验证了:

  • 区域设置仍以意大利语设置。
  • 选中“自动调整夏令时更改时钟”。
  • 打开区域和设置 - &gt;在标签位置 - &gt;目前的位置仍然是意大利。
  • os Windows 7 x64

求助:

框架更新将DynamicDaylightTimeDisabled的值更改为1.要解决此问题,必须将其转为0并重新启动。另一种方法是使用时钟UI表单。

2 个答案:

答案 0 :(得分:2)

检查var tziLocal = TimeZoneInfo.Local;的值(参见Shaun的回答)及其Id属性。

等价(我认为),转到PowerShell并写一下:

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

并检查TimeZoneKeyName winreg“property”的值。 Get-ItemProperty可以缩短为gp

根据实验,CurrentCultureCurrentUICultureRegionInfo.CurrentRegion 用于确定“当地时间”。

相反,如果您转到Windows,控制面板→时钟,语言和区域→日期和时间→选项卡日期和时间→部分时区→按钮更改时区... ,更改区似乎有效。

当然,如果Windows注册表包含意大利的错误设置,通常是您的特定计算机上的ID "W. Europe Standard Time"(不是"Romance Standard Time",而不是"Central European Standard Time"),这将是一个问题。

答案 1 :(得分: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);