2015-11-05 148 views
3

我有一个非常奇怪的行为TimeZoneInfo.ConvertTimeFromUtc。 你如何看待这个回报?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

WAT?

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

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

+0

你是否确定?这似乎很奇怪。它会在我身上返回'{01.01.2000 15:00:00}'。 –

+0

@SonerGönül,是的,我确定。它看起来像安装了VS的新版本后得到了一个DLL的bug。 – Neshta

+0

顺便问一下你的环境是什么? .Net Framework版本和Windows版本? –

回答

2

其实,转换是正确的。

虽然这是真的,白俄罗斯目前有是全年UTC + 3时区,它只能是自2012年

此前这种方式,其标准偏移是UTC + 2 ,并观测到从三月的最后一个星期日到十月的最后一个星期日,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在问题评论中提到的时间的原因。)

+0

现在我明白了。谢谢澄清马特。 –