为什么.NET没有正确转换时间?

时间:2013-03-17 00:20:24

标签: c# .net timezone dst

在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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

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

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

由于这个原因,你无意中告诉它将时间转换为UTC并将其传递给UTC(即格林尼治标准时间),但随后告诉它时间是“欧洲标准时间”,即一小时在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位于“W. Europe标准时间”,即UTC + 1。但事实并非如此!因此结果不正确。

[编辑回复以下评论]

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

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

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

[第二次修改]

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

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

答案 2 :(得分:-1)

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

顺便提一下,英国的夏令时与西欧的夏令时相同。同时格林威治与西欧时间相同 - 同一时区,但是BST在2002年与欧盟规则相匹配之前就开始于历史上。有效地,同一系统的名称不同。