【问题标题】:TimeZoneInfo.ConvertTimeFromUtc returns incorrect resultTimeZoneInfo.ConvertTimeFromUtc 返回不正确的结果
【发布时间】:2016-02-06 07:33:35
【问题描述】:

我对@9​​87654323@ 有一个非常奇怪的行为。 你觉得这会返回什么?

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}。 但我看到下一个:

什么?

这几天前工作正常。但是今天我运行了单元测试并注意到了这一点。在运行测试之前,我安装了 Visual Studio 2015。会发生什么,为什么?如何解决?

PS:它可以在另一台机器上正常工作。

【问题讨论】:

  • 真的确定吗?这似乎很奇怪。它在我身上返回{01.01.2000 15:00:00}
  • @SonerGönül,是的,我确定。安装新版本的 VS 后看起来好像有一个有 bug 的 dll。
  • 顺便问一下你的环境是什么? .Net Framework 版本和 Windows 版本?
  • .NET 框架 4.5.1,Windows 8.1

标签: c# datetime timezone


【解决方案1】:

其实转换是正确的。

虽然白俄罗斯目前确实有一个全年为 UTC+3 的时区,但自 2012 年以来一直如此。

在此之前,它的标准偏移量是 UTC+2,并且从 3 月的最后一个星期日到最后一个星期日,它观察到了 UTC+3 的夏令时(又称“夏令时”)偏移量在十月。这种变化是通过在 2011 年的夏季保持并永久留在那里而不是倒退来实现的。

You can see the history of changes here.

当您使用"Belarus Standard Time" 时区时,该时区的信息将从以下位置的 Windows 注册表中的数据中提取:

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

您将在此处看到基本信息,以及一个名为 Dynamic DST 的子项,其中包含逐年变化。您会注意到 Windows 为该区域提供了三个条目:

  • 一个用于 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得到问题cmets中提到的15:00的时间。)

【讨论】:

  • 现在我明白了。感谢马特的澄清。
猜你喜欢
  • 2012-04-11
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2014-11-03
  • 2021-10-07
相关资源
最近更新 更多