【问题标题】:Why doesn't .NET convert the time correctly?为什么.NET 不能正确转换时间?
【发布时间】:2013-03-05 13:51:01
【问题描述】:

在 2013 年,英国将在 3 月 31 日之前开始夏令时。

不过,当我尝试将给定时间转换为 UTC 时间时,TimeZoneInfo.ConvertTimeToUtc 会减去一小时。

这是为什么?我是否需要告诉这个方法夏令时没有激活?

var now = new DateTime(DateTime.Now.Ticks, DateTimeKind.Unspecified);
var convertedTime = TimeZoneInfo.ConvertTimeToUtc(now, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard time"));
Console.WriteLine(convertedTime); // subtracts one hour, even though England time and GMT should be equal

【问题讨论】:

标签: c# .net timezone dst


【解决方案1】:

[注意:此答案假定运行代码的计算机位于 GMT 时区]

这是因为根据 .Net,“西欧标准时间”与 UTC 时区不同(即使它应该是)。 这很奇怪,似乎是 .Net 库中的一个错误。

因此,您无意中告诉它将时间转换为 UTC 并传递给它一个 UTC(即 GMT 时间),但随后告诉它时间为“西欧标准时间”,即一小时在 UTC 之前。

所以自然而然地,一个小时的结果就不同了。

一步一步:

var now = new DateTime(DateTime.Now.Ticks, DateTimeKind.Unspecified);

这会将now 设置为UTC 时间。

var convertedTime = TimeZoneInfo.ConvertTimeToUtc(now, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard time")

这会将now 转换为UTC,假设now 处于“西欧标准时间”,即UTC+1。但事实并非如此!所以结果不正确。

[编辑下面的 cmets]

请注意,"W. Europe Standard time" 应该是 UTC,但出于某种原因不是。当你这样做时:

TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard time")

它返回 UTC+1 而不是(显然)正确的 UTC。它甚至将名称更改为"W. Europe Daylight Time"。看起来这可能是一个奇怪的错误?

[二次编辑]

查看Microsoft Time Zone Index Values (and also here)。 (注意这些链接实际上都不适用于 Windows 7,但它们包含相同的定义。)

它有一个“W. Europe Standard Time”条目,其中明确指出(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna

【讨论】:

  • 如果您查看任何在线转换器,并尝试将英国时间转换为 UTC,您会发现它们是相同的,并且直到 3 月 31 日。我错过了什么吗?
  • 你在英国吗?如果是,您的代码将导致时间延迟一小时。
  • “这是因为“西欧标准时间”与 UTC 时区不同。”真的吗?你有这方面的参考吗?因为Wikipedia disagrees with you.
  • 看来Windows“W.欧洲标准时间”与“西欧时间”不同。这真是令人困惑。
  • @svick 是的,在 Windows 注册表中,W. Europe Standard TimeWestern European Summer Time 匹配,wikipedia 不匹配 Western European Time
【解决方案2】:

您只是使用了错误的时区。英格兰位于“GMT 标准时间”区域。

“西欧标准时间”区域适用于欧洲大陆、阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳,UTC+01:00。

【讨论】:

【解决方案3】:

嗯,我们有两个是西欧时间,西欧夏季/日光时间不是吗?可能是通过输入西欧标准时间,您会自动匹配到最接近的时间,即夏季或日光 - 无论标准是否被列为时区。

顺便说一下,英国夏令时与西欧夏令时/夏令时相同。格林威治同时与西欧时间匹配 - 相同时区,但 BST 在历史上开始更早,在 2002 年与欧盟规则匹配之前。实际上,相同的系统不同的名称。

【讨论】:

  • 这已被回答,并且标记的答案是正确的。他们只是使用了错误的 Windows 时区 ID。
猜你喜欢
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2021-08-31
  • 2011-06-08
相关资源
最近更新 更多