在 JavaScript 中一秒有多长?

主要观点:询问 JavaScript 中一秒的时长看似简单,实则复杂,涉及历史、科学和现代计算基础。人类测量时间的方法不断演进,从早期观察自然现象到原子钟的发明实现高精度计时,不同时间标准如 UT、TAI、UTC 及 leap seconds 相互关联又有差异。JavaScript 的时间系统基于 POSIX 时间,与 UTC 不同,忽略 leap seconds ,在处理 leap seconds 时传统方法是 step adjustment 会导致时钟跳跃,实用方法是 smearing 逐渐调整,大多数应用中此差异不重要,但在对精度要求高的应用中会产生误差。

关键信息:

  • 时间测量始于自然现象观察,古代文明将天分为日、月、年,后埃及人和巴比伦人将日分为 24 小时等。
  • 1950 年代发明原子钟,定义秒为铯 -133 原子基态两个超精细能级间跃迁对应辐射的 9192631770 个周期,形成国际原子时 TAI 。
  • Universal Time 基于地球自转,因地球自转不规律需引入 Coordinated Universal Time (UTC)来协调与原子时的差异,通过添加或删除 leap seconds 使 UTC 与 UT 相差不超过 0.9 秒。
  • JavaScript 的时间基于 POSIX 时间,以 1970 年 1 月 1 日 00:00:00 UTC 为起点,测量毫秒数,每天 86400 秒,忽略 leap seconds 。
  • POSIX 时间与 UTC 不同,不包含 leap seconds ,处理 leap seconds 时传统方法 step adjustment 会使时钟跳跃,实用方法 smearing 逐渐调整,Google 的 NTP 服务器采用 smearing 方法。
  • 大多数应用中 JavaScript 时间精度足够,99%的问题源于时区,但在科学研究和金融系统等对精度要求高的应用中,leap seconds 和 smearing 导致的差异会造成误差。

重要细节:

  • 原子钟基于铯原子振动,提供高精度计时。
  • UTC 中的 leap seconds 偶尔调整以保持与 UT 同步。
  • POSIX time 中每天 86400 秒,忽略地球自转变化。
  • step adjustment 使 POSIX (step)在 leap second 处有时间跳跃。
  • smearing 使 POSIX (smear)在 leap second 期间秒的时长略有变化。
  • 提到多个相关网站如 https://en.wikipedia.org/wiki... 等用于进一步了解相关知识。
阅读 11
0 条评论