8

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

尽管如此,TimeZoneInfo.ConvertTimeToUtc当我尝试将给定时间转换为 UTC 时间时,仍会减去一小时。

为什么是这样?我是否需要告诉这个方法夏令时无效?

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
4

3 回答 3

8

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

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

于 2013-03-17T01:33:18.903 回答
2

[注意:此答案假定运行代码的计算机位于 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。但事实并非如此!因此结果不正确。

[编辑回应以下评论]

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

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

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

[二次编辑]

查看Microsoft 时区索引值以及此处)。(请注意,这些链接实际上都不适用于 Windows 7,但它们包含相同的定义。)

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

于 2013-03-17T00:30:38.510 回答
-1

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

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

于 2013-06-10T16:49:32.823 回答