在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
答案 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 Values(and also here)。 (注意这些链接实际上都不适用于Windows 7,但它们包含相同的定义。)
它有一个“W. Europe Standard Time”的条目,它明确指出(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
答案 2 :(得分:-1)
那么我们两个是西欧时间,西欧夏天/白天时间不是吗?可能是通过输入西欧标准时间,您将自动匹配最接近的,即夏季或白天 - 无论标准是否被列为时区。
顺便提一下,英国的夏令时与西欧的夏令时相同。同时格林威治与西欧时间相同 - 同一时区,但是BST在2002年与欧盟规则相匹配之前就开始于历史上。有效地,同一系统的名称不同。