【问题标题】:TimeZoneInfo bug in .net 4.5.net 4.5 中的 TimeZoneInfo 错误
【发布时间】:2013-11-19 11:53:59
【问题描述】:

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

经过深入分析,我发现:

.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 并重新启动。另一种方法是使用时钟 UI 表单。

【问题讨论】:

  • 使用NodaTime。 .NET DateTime 类有一些麻烦。
  • 此处不复现。你确定CurrentCulture。 .NET 4.5 机器上的 Windows 区域设置是否已更改?
  • 我也无法重现这个。都使用我自己的文化 (nl-BE) 和 it-IT。
  • 运行测试时,时区和“自动调整时钟以适应夏令时变化”设置是否相同?
  • 在假设框架中存在错误之前,我往往会非常小心。虽然有一些问题,但大多数问题来自其他来源。

标签: c# asp.net .net datetime


【解决方案1】:

检查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"),那将是一个问题。

【讨论】:

  • 在注册表路径 HKEY_LOCAL_MACHINE -> SYSTEM -> CURRENTCONTROLSET -> CONTROL -> TIMEZONEINFORMATION 中 timezoninfoKey 设置为更正“W. Europe Standard Time”,但我注意到“DynamicDaylightTimeDisabled”键设置为“1”在4.5机器和4.0机器中的“0”虽然我改变了它并且问题没有改变。
  • 我没有问题。在我看来,DynamicDaylightTimeDisabled0DaylightStart00 00 03 00 05 00 02 00 00 00 00 00 00 00 00 00(希望是“三月的最后一个星期日”)。
  • 你的机器有什么操作系统?
  • @Riccardo Windows 7 SP1.
【解决方案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);

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 2011-06-26
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多