我最近使用.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的国家/地区)的日光时间范围,所以看起来框架中有一个(巨大的)错误。但是我找不到任何有用的东西。
我在两台机器上验证了:
求助:
框架更新将DynamicDaylightTimeDisabled的值更改为1.要解决此问题,必须将其转为0并重新启动。另一种方法是使用时钟UI表单。
答案 0 :(得分:2)
检查var tziLocal = TimeZoneInfo.Local;
的值(参见Shaun的回答)及其Id
属性。
等价(我认为),转到PowerShell并写一下:
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation -Name TimeZoneKeyName
并检查TimeZoneKeyName
winreg“property”的值。 Get-ItemProperty
可以缩短为gp
。
根据实验,CurrentCulture
,CurrentUICulture
和RegionInfo.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);