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

PHP手册指出, time()返回 “当前的UNIX时间戳”  和microtime()返回 “当前的Unix时间戳与微秒”ʙ 。

但是,这些function是否保证与严格符合POSIX.1标准的系统一样呢?

具体来说,闰秒插入的方式是输出time() & hairsp; |  microtime()在第二天开始时向后跳跃1秒(也就是在闰秒的末尾),在整个第一秒中给我们重复的返回值(与新鲜的独特值相反)那第二天?

例如,如果我们轮询time()   |  在1998年-12-31年和1999年-01年的整个跨度内,每微秒microtime()会有两次出现在915和148的范围内。 148 hairsp; 801?

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

UNIX时间戳,就像你在PHP中从time()获得它一样,是一个奇怪的野兽。

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

这有一些重要的含义:

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

解决方法

如果Unix时间戳既不突然跳跃也不会持续2秒? 这正是Google为他们的服务器所做的。 他们的解决办法是在很长的一段时间内只缓慢地扭曲时间仅仅几毫秒 ,使闰秒几乎无形地转移到应用程序上。 (就Google服务器上的应用程序和操作系统而言, IERS不再插入闰秒)。

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