首页 文章

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

提问于
浏览
8

在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 回答

  • 2

    您只是使用错误的时区 . 英格兰处于“格林尼治标准时间标准时间”区域 .

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

  • 8

    [注意:此答案假设运行代码的计算机处于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早一个小时 .

    所以很自然地,在一小时内产生的时间不同 .

    一步步:

    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 Standard time"中,即UTC 1.但它不是!因此结果不正确 .

    [EDIT in response to comments below]

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

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

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

    [Second Edit]

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

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

  • -1

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

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

相关问题