在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 回答
您只是使用错误的时区 . 英格兰处于“格林尼治标准时间标准时间”区域 .
“欧洲标准时间”区域适用于欧洲大陆,阿姆斯特丹,柏林,伯尔尼,罗马,斯德哥尔摩,维也纳,UTC 01:00 .
[注意:此答案假设运行代码的计算机处于GMT时区]
根据.Net(即使应该是),它与UTC的时区相同's because 2613766 isn' . This is very odd, and seems like a bug in the .Net libraries.
因此,您无意中告诉它将时间转换为UTC并将其传递给UTC(即GMT时间)但随后告诉它时间是“W.欧洲标准时间”,这比UTC早一个小时 .
所以很自然地,在一小时内产生的时间不同 .
一步步:
这将
now
设置为UTC的时间 .这会将
now
转换为UTC,假设now
在"W. Europe Standard time"中,即UTC 1.但它不是!因此结果不正确 .[EDIT in response to comments below]
请注意,
"W. Europe Standard time"
应为UTC,但不是出于某种原因 . 当你这样做:它返回UTC 1而不是(显然)正确的UTC . 它甚至将名称更改为
"W. Europe Daylight Time"
. 好像它可能是一个奇怪的错误?[Second Edit]
看看Microsoft Time Zone Index Values(and also here) . (注意这些链接实际上都不适用于Windows 7,但它们包含相同的定义 . )
它有一个"W. Europe Standard Time"的条目,明确表示
(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
那么我们两个是西欧时间,西欧夏天/白天时间不是吗?可能是通过输入西欧标准时间,您将自动匹配最接近的,即夏季或白天 - 无论标准是否被列为时区 .
顺便提一下,英国的夏令时与西欧的夏令时相同 . 格林威治同时与西欧时间相同 - 同一时区,但BST在历史上早于开始,之后在2002年与欧盟规则相匹配 . 实际上,同一系统的名称相同 .