gpt4 book ai didi

javascript - javascript 中的闰秒在哪里?

转载 作者:行者123 更新时间:2023-11-29 23:15:13 26 4
gpt4 key购买 nike

当我使用

  • 一个custom zoneinfo file for TAI或/usr/share/zoneinfo-leaps 和
  • 修改后的 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

但是:JavaScript 不会:

-阿恩

最佳答案

JavaScript Date 对象特别遵循 Unix Time 的概念(尽管精度更高)。这是 POSIX 规范的一部分,因此有时称为“POSIX 时间”。它不计算闰秒,而是假定每天恰好有 86,400 秒。您可以在 section 20.3.1.1 of the current ECMAScript specification 中阅读相关内容,其中指出:

Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC. In time values leap seconds are ignored. It is assumed that there are exactly 86,400,000 milliseconds per day.

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

因为您更改了系统以跟踪 TAI 而不是 UTC,并且在您的系统上有 date 命令理解的闰秒表的实现,然后在您的系统上 time_t 不是 Unix 时间戳,而是 TAI-based variant伪装成 Unix 时间戳。仅仅因为 date 命令和其他底层函数识别了这一点,并不意味着它会传递到您机器上的所有平台和运行时。

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

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

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

关于javascript - javascript 中的闰秒在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53019726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com