时间()保证是闰秒意识吗?

时间:2011-10-15 20:32:21

标签: php linux windows time hhvm

PHP手册指出time()返回 "当前UNIX时间戳"  ­microtime()返回 "当前Unix时间戳,并带有微秒" ʙ

但是,这些功能保证的行为是否像that of strictly conforming POSIX.1 systems一样?

具体来说,以time() |的输出方式插入闰秒microtime()在第二天开始时将向后跳1秒(也就是在闰秒结束时),让我们重复返回值 - 与新鲜唯一值相对 - 在第二天的整个第一秒的整个过程中?

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

3 个答案:

答案 0 :(得分:10)

从PHP中的time()获取UNIX时间戳是一种特殊的野兽。

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

这有一些重要意义:

  • 您始终可以准确地将UTC转换为UNIX时间戳
  • 您可以始终(对于所有时间点)从时间戳转换为UTC
  • Unix时间戳是非连续的,即它退后一步。 (或者,它保持不变,不会增加2秒。)
  • 如果从UNIX时间戳转换为UTC时出现转换错误,则错误最多为2秒。 (这意味着你可能会错误的一天。)
  • retrospect 中,Unix时间戳将显示为线性。这意味着如果您正在存储时间序列数据,并且您不关心每年一两秒钟的错误表示,那么您可以认为存储的带时间戳的数据是连续的。

<强>变通方法

如果Unix时间戳突然没有突然支持,也不会在2秒内保持不变,该怎么办?这正是谷歌为他们的服务器所做的事情。他们的解决方案是slowly skew the time merely milliseconds at a time很长一段时间,使闰秒变换几乎无形地应用于应用程序。 (就Google服务器上的应用程序和操作系统而言,the IERS不再插入闰秒。)

答案 1 :(得分:8)

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

答案 2 :(得分:1)

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