gpt4 book ai didi

c# - TimeZoneInfo.ConvertTimeFromUtc 返回不正确的结果

转载 作者:行者123 更新时间:2023-11-30 16:51:44 25 4
gpt4 key购买 nike

我对 TimeZoneInfo.ConvertTimeFromUtc 有一个非常奇怪的行为。您如何看待这会返回什么?

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

什么?

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

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

最佳答案

实际上,转换是正确的。

虽然白俄罗斯目前的时区全年都是 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得到问题评论中提到的15:00时间的原因。)

关于c# - TimeZoneInfo.ConvertTimeFromUtc 返回不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33545021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com