49

在 .NET 中,以下语句返回不同的值:

Response.Write(
  TimeZoneInfo.ConvertTime(
    DateTime.Parse("2010-07-01 5:30:00.000"),
    TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"),
    TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"))
  );
// displays 7/1/2010 1:30:00 PM

..还有这个...

Response.Write(
  TimeZoneInfo.ConvertTime(
    DateTime.Parse("2010-07-01 5:30:00.000"),
    TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"),
    TimeZoneInfo.FindSystemTimeZoneById("UTC"))
  );
// displays 7/1/2010 12:30:00 PM

为什么是这样?我认为 UTC 和 GMT 标准时间是等价的。


更新

经过进一步测试,我发现以下内容似乎是等效的:

“世界标准时间”

“格林威治标准时间”

“摩洛哥标准时间”

鉴于夏季月份的情况有所不同:

“格林威治标准时间”

也许我的问题应该是,为什么“格林威治标准时间”和“格林威治标准时间”不同?

结束更新

4

7 回答 7

40

GMT 不针对夏令(DST) 进行调整。你可以在这个网站上从马的嘴里听到它。

添加这行代码可以查看问题的根源:

  Console.WriteLine(TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time").SupportsDaylightSavingTime);

输出:真。

这不是 .NET 问题,而是 Windows 搞砸了。TimeZoneInfo 使用的注册表项是 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\GMT 标准时间。你最好坚持使用UTC。

于 2010-02-18T22:02:00.710 回答
26

[我真的只是支持Hans Passant的回答]

在我看来,“格林威治标准时间”一词的使用似乎很混乱,它似乎被用来表示“格林威治标准时间”以及英国/爱尔兰使用的时区——它在冬季格林尼治标准时间和英国夏季时间之间翻转在夏天,似乎没有一个定义明确的名字!

更令人困惑的是,我运行了MSDN 文档中 TimeZoneInfo.GetSystemTimeZones的示例代码并查看了输出。

看到以下“GMT 标准时间”时区的定义,我感到非常惊讶

ID:格林威治标准时间
   显示名称:(UTC) 都柏林、爱丁堡、里斯本、伦敦
   标准名称:GMT 标准时间
   夏令时名称:GMT 夏令时***有夏令时***
   与 UTC 的偏移量:0 小时 0 分钟
   调整规则数:1
   调整规则:
      从 01/01/0001 00:00:00 到 31/12/9999 00:00:00
      达美:01:00:00
      3 月第 5 周周日 01:00 开始
      于 10 月第 5 周的星期日 02:00 结束

似乎(至少在我看来)在微软负责定义时区的人真的把这里的水搅得更深了。

他们显然想描述英国/爱尔兰使用的时区,但他们给了它一个 ID,在 ID 和显示名称中包含术语“GMT”和 UTC。我相当有信心这个时区定义(无论它应该被称为什么)不是UTC。它可能有半年时间与 UTC 非常相似,但仅此而已!

于 2010-09-21T12:24:58.620 回答
16

这是原始提问者不太可能阅读的较晚回复,但谷歌搜索该主题的人可能会找到。

格林威治标准时间格林威治标准时间的名称在雷德蒙德之外是未知的。它们是只出现在名为 Windows 注册表的动物寓言中的神话动物。在现实世界中,英国在冬季遵守 GMT(格林威治标准时间),在夏季遵守 BST(英国夏令时)。BST 比格林威治标准时间提前 1 小时(向东)。欧洲人通常不会谈论“夏令时”而是“夏令时”,至少在我所知道的语言中是这样。

一位受访者表示应该优先使用UTC而不是GMT。这个来自国际天文学联合会的建议可以追溯到 1935 年。它的要点是,在 1925 年之前,GMT 是从中午而不是午夜开始计算的,所以即使是 10 年后,模棱两可的可能性可能仍然存在。但现在有点过时了。在过去的 80 年里,GMT 和世界时这两个术语几乎是同义词。不完全是,当然。但是您需要一位天文学家向您解释其中的差异。如果您关心的是几小时而不是几秒钟,那么您可能不会在意。

GMT 是关于英语国家的民用计时。它并没有过时。它在英国、爱尔兰、加拿大甚至比利时都被载入法律。

世界时的各种风格都与天文计时有关。

我认为,民间计时是最初的问题所在。

于 2014-04-15T23:34:02.850 回答
13

区别如下:

希望这可以帮助

于 2010-02-18T21:41:02.170 回答
4

“GMT标准时间” = 英国时间(冬季为 GMT+0,英国夏季为 GMT+1。)

基本上,如果您想将 UTC 转换为英国时间,请使用“GMT标准时间

普通的旧“GMT”(或格林威治标准时间)或多或少是 UTC,或多或少是几毫秒。它不会针对英国的夏令时进行调整,因此我们从未有过它的用例。

所有其他答案都以一种非常冗长的方式解释了这一点,其中一些具有误导性或矛盾性,因此我想提供另一个答案,希望它能为人们节省所有的阅读和困惑。

于 2020-06-16T13:29:53.570 回答
1

TimeZoneInfo具有.Idof的对象"GMT Standard Time"对应.DisplayName"(UTC) Dublin, Edinburgh, Lisbon, London"

该时区在冬季使用格林威治标准时间 (GMT) (UTC+0),在夏季使用英国夏令时 (BST) (UTC+1)。

参考这里

UTC 的时区有一个.Idof"UTC"和一个.DisplayNameof "(UTC) Coordinated Universal Time"

它们是两种不同的时区设置。

此外,在查看 Windows 中的时区显示名称列表时:

时区列表

括号中的值只是标准偏移量,因此虽然看起来有四种不同的 UTC 设置,但实际上只有一种。只是当夏令时无效时,其他三个区域使用 UTC 作为其基本偏移量。

于 2013-07-02T14:50:47.687 回答
0

这是对Coordinated Universal Timezones的讨论。当时间范围需要高精度时,似乎通常使用 UTC。Greenwhich 同时非常接近,并与 UTC 来回使用。

希望这会有所帮助。

于 2010-02-18T21:40:52.763 回答