javascript中的闰秒在哪里?

Arn*_*ner 7 javascript timezone zoneinfo

当我使用

  • TAI或 /usr/share/zoneinfo-leaps的自定义 zoneinfo 文件
  • 修改后的 NTP 客户端(目前只增加 27 秒;并等待大约 1 秒关闭的时间戳)

在我的 ArchLinux 机器上,系统时间表现良好:

> date
Tue Oct 23 17:10:34 TAI 2018
> date -d @1483228827
Sun Jan  1 00:00:00 UTC 2017
> date -d @1483228826
Sat Dec 31 23:59:60 UTC 2016
> date -d @1483228825
Sat Dec 31 23:59:59 UTC 2016
Run Code Online (Sandbox Code Playgroud)

但是:JavaScript 不会:

  • 测试页
  • 截屏

    1. Mozilla/Firefox/Javascript 是否在某处使用自己的 zoneinfo 文件?
    2. 我该如何解决?
    3. 甚至专注于时间的网站似乎都做对了……或者我错过了什么?

-arne

Mat*_*int 6

JavaScriptDate对象特别遵循Unix 时间的概念(尽管精度更高)。这是 POSIX 规范的一部分,因此有时称为“POSIX 时间”。它不计算闰秒,而是假设每天正好有 86,400 秒。您可以在当前 ECMAScript 规范的第 20.3.1.1 节中阅读相关内容,其中指出:

时间在 ECMAScript 中以 UTC 时间 1970 年 1 月 1 日以来的毫秒为单位进行测量。在时间值中,闰秒被忽略。假设每天正好有 86,400,000 毫秒。

JavaScript 在这方面并不是独一无二的。这是绝大多数其他语言所做的,包括 Python、Ruby、.NET、time_tC 中的典型实现以及许多其他语言。

因为你已经改变了你的系统来跟踪 TAI 而不是 UTC,并且在你的系统上有一个date命令理解的闰秒表的实现,那么在你的系统time_t上不是一个 Unix 时间戳,而是一个基于 TAI 的变体伪装作为 Unix 时间戳。仅仅因为date命令和其他底层函数认识到这一点,并不意味着它会贯穿到您机器上的所有平台和运行时。

事实上,闰秒的不可预测性使得它们很难在 API 中使用。人们通常不能传递需要正确解释闰秒表的时间戳,并期望一个系统将它们解释为另一个系统。例如,当你的榜样时间戳14832288262017-01-01T00:00:00Z您的系统上,它会被解释为2017-01-01T00:00:26Z基于POSIX系统或系统没有闰秒表。所以它们不是便携式的。即使在具有完整更新表的系统上,也不知道这些表将来会包含什么(超过 6 个月的 IERS 公告期),因此我无法在没有最终更改的风险的情况下生成未来时间戳。

需要明确的是 - 为了在编程语言中支持闰秒,实现必须不遗余力地这样做,并且必须做出并不总是可以接受的权衡。虽然也有例外,但一般的立场是不支持它们——不是因为有任何颠覆或积极的反制措施,而是因为正确地支持它们要困难得多。

也就是说,如果你真的关心 JavaScript 中的闰秒,你就有希望。您可以将您的想法添加到TC39 Temporal 提案(我是其中的冠军之一)。这不会改变Date对象的行为- 已经烘焙并且已经存在了几十年。但是我们正在为 JavaScript 中的日期和时间开发一组新的标准对象,希望得到您的反馈和参与。有一个线程,我们一直在考虑各种方式让闰秒成为问题#54 中的一部分. 目前,我们还没有过多考虑基于 TAI 的系统。如果这是您有经验的领域,请在那里添加您的想法。请记住,我们需要在这与社区的一般需求之间取得平衡,但我们希望得到您的意见。谢谢!