8

PHP 手册声明time()返回 “当前 UNIX 时间戳” ᴀ microtime()返回 “以微秒为单位的当前 Unix 时间戳” ʙ

但是,这些功能是否保证表现得像严格符合 POSIX.1 系统的功能

具体来说,是否插入闰秒,使得time() |的输出 在第二天开始时向后microtime() 跳1 秒,(这也是闰秒结束时)在接下来的第一秒的整个过程中为我们提供重复的返回值——而不是的唯一值天?

例如,如果我们轮询time() | microtime()在 1998-12-31 和 1999-01-01 的跨度内每微秒,915 148 800 <= x < 915 148 801 范围内的每个值会出现两次吗?

4

3 回答 3

13

UNIX 时间戳,正如您从 PHP 中的 time() 获得的那样,是一种奇特的野兽。

我花了很长时间才理解这一点,但发生的情况是时间戳在闰秒期间增加,当闰秒结束时,时间戳(但不是 UTC!)跳回一秒。

这有一些重要的含义:

  • 您始终可以准确地将 UTC 转换为 UNIX 时间戳
  • 不能总是(对于所有时间点)从时间戳转换为 UTC
  • Unix 时间戳是不连续的,即它后退。(或者,它保持不变而不增加 2 秒。)
  • 如果从 UNIX 时间戳转换为 UTC 时出现转换错误,则该错误最多会延迟 2 秒。(这意味着你可能会得到错误的一天。)
  • 回想起来,Unix 时间戳将呈现线性。这意味着,如果您正在存储时间序列数据并且您不关心每年一两秒被错误地表示,那么您可以考虑存储的时间戳数据是连续的。

解决方法

如果 Unix 时间戳既没有突然跳回也没有保持 2 秒不变怎么办?这正是谷歌为他们的服务器所做的事情。他们的解决方案是在很长一段时间内一次仅将时间缓慢倾斜几毫秒,以使闰秒对应用程序几乎不可见。(就谷歌服务器上的应用程序和操作系统而言,IERS不再插入闰秒不再插入闰秒。)

于 2012-08-23T06:43:08.027 回答
9

PHP 是一种服务器端语言。time() 函数将解析为该服务器的系统时间。如果服务器正在运行 NTP 守护程序,那么它将感知闰秒并相应地进行调整。PHP对此一无所知,但系统知道。

于 2011-10-15T20:42:32.013 回答
1

time()只返回 UNIX 时间戳。这意味着,它不受闰秒(等等)的影响,因为你永远不会“失去”时间,只是因为有人决定了它。只有文本表示(例如使用创建的date())受到影响。

于 2011-10-15T20:41:57.830 回答