PHP:为什么DateTimeZone::listIdentifiers()函数列出UTC而不是GMT


PHP: Why does DateTimeZone::listIdentifiers() function list UTC instead of GMT

为什么PHP的DateTimeZone::listIdentifiers()函数会列出UTC而不是GMT。?

GMT是一个时区,UTC是根据http://www.timeanddate.com/time/gmt-utc-time.html

实际上,它列出了两者,以及同一事物的其他几个名称:

GMT            GMT+0          GMT-0        GMT0        UTC        UCT
Etc/GMT        Etc/GMT+0      Etc/GMT-0    Etc/GMT0    Etc/UTC    Etc/UCT
Greenwich      Universal      Zulu
Etc/Greenwich  Etc/Universal  Etc/Zulu

您可以查看PHP的列表,或者维基百科上的通用tzdb列表。

TZDB中的规范形式(它们的来源)是"Etc/UTC",但规范的定义可能因每个消费者而异。例如,CLDR根据其规则认为"Etc/GMT"是规范的。其他系统可以定期使用CCD_ 3或CCD_。这四个是主要的,其余的大多是出于向后兼容性的原因,通常应该避免。

至于为什么这些术语可以互换使用,这是因为无论出于何种目的,它们在我们的现代用法中都是相同的。请在我的博客上查看UTC与GMT的对比。

总的来说,这是我有根据的观点:

  • 当特别指英国时区中不在夏令时的部分时,请使用GMT(在夏令时期间使用BST),或在冰岛等地全年使用时(除非当地使用不同的约定)。

  • 英国上下文中使用GMT,例如BBC如何以GMT宣布时间。

  • 在时区偏移中首选UTC,尤其是在完全合格的情况下,如UTC-08:00UTC+05:30可以接受以短形式使用具有全小时偏移的GMT,如GMT+2GMT-5,但仍应避免(IMHO),因为它们缺乏精度。此外,定义各国时区的大多数法律文件都提到了协调世界时,即UTC,而不是GMT

  • 在所有其他情况下,当不确定时,首选UTC

你提到的timeanddate.com的文章没有错——这只是一个解释和观点的问题。从术语的角度来看,GMT是一个时区,UTC是一个计时系统,这是绝对正确的。

我给你上一堂简短的历史课:

  • GMT是最早发明的,最初被定义为英国格林威治天文台观测到的平均太阳时。这实际上意味着通过望远镜检查恒星的位置,做一些数学运算来计算地球的旋转速度和位置,并用手设定一个时钟。这最终变得更加自动化,产生了UT1标准

  • UTC出现得较晚,其定义更加科学精确。UTC基于TAI原子钟标准,加上周期性插入的闰秒,使其与UT1保持在0.9秒内。

  • 随着UTC的采用,GMT最终在民用环境中成为UTC的意思。今天,当您听到术语GMT时,它的值与UTC完全相同。GMT本身不再精确定义。

  • 同样值得一提的是,格林尼治标准时间最初被认为是从中午开始的"一天",而不是午夜。我们很少再这样做了,包括当我们使用"GMT"这个词时。

若你们感兴趣的话,维基百科关于格林尼治标准时间的文章会有更多的历史。