首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在javascript中,闰秒在哪里?

在javascript中,闰秒在哪里?
EN

Stack Overflow用户
提问于 2018-10-27 15:32:16
回答 1查看 980关注 0票数 7

当我使用

在我的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没有:

1. Does Mozilla/Firefox/Javascript use its own zoneinfo files somewhere?
2. How can i fix it?
3. Not even [websites dedicated to time](http://www.thetimenow.com/time-calculator) seem to get it right... Or am i missing something?

-arne

EN

回答 1

Stack Overflow用户

发布于 2018-10-28 07:48:28

JavaScript Date对象明确遵循了Unix Time的概念(尽管具有更高的精度)。这是POSIX规范的一部分,因此有时被称为"POSIX时间“。它不计算闰秒,而是假设每天恰好有86,400秒。您可以在section 20.3.1.1 of the current ECMAScript specification中了解到这一点,其中指出:

自1970年1月1日协调世界时以来,

时间以毫秒为单位进行测量。在时间值中,leap秒被忽略。假设每天恰好有86,400,000毫秒。

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

因为您已经更改了系统以跟踪TAI而不是协调世界时,并且您的系统上有一个date命令能够识别的闰秒表的实现,所以在您的系统上,time_t不是一个Unix时间戳,而是一个伪装成Unix时间戳的TAI-based variant。仅仅因为date命令和其他底层函数能够识别这一点,并不意味着它适用于您机器上的所有平台和运行时。

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

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

也就是说,如果你真的关心JavaScript中的闰秒,你还是有希望的。您可以将您的想法添加到TC39 Temporal proposal (我是它的拥护者之一)。这不会改变Date对象的行为--它已经烘焙了几十年了。但我们正在为JavaScript中的日期和时间开发一组新的标准对象,并希望得到您的反馈和参与。在issue #54中有一条线索,我们一直在以各种方式考虑leap seconds可能是这个问题的一部分。目前,我们还没有在基于TAI的系统中投入太多精力。如果这是您有经验的领域,请在此添加您的想法。请记住,我们需要平衡这一点与社区的一般需求,但我们希望您的想法。谢谢!

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53019726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档