Гарантируется ли время () с точностью до секунды? - PullRequest
6 голосов
/ 16 октября 2011

В руководстве PHP указано, что time() возвращает & puncsp; " текущую метку времени UNIX " & thinsp; & # xfeff; & puncsp; & shy; и microtime() возвращает & puncsp; " текущую метку времени Unix с микросекундами " & thinsp; & # xfeff; ʙ .

Однако гарантированно ли эти функции будут вести себя подобно , что в строго соответствующих системах POSIX.1 ?

В частности, добавляются ли дополнительные секунды таким образом, чтобы выходные данные time() & hairsp; | & hairsp; & shy; microtime() прыгали назад на 1 секунду в начале следующего дня, (который также находится в конце високосной секунды), давая нам повторных возвращаемых значений & mdash; вместо свежих уникальных значений & mdash; в течение всей первой секунды следующего дня?

Например, если мы будем опрашивать time() & hairsp; | & hairsp; & shy; microtime() каждую микросекунду в течение всего периода 1998 г. & # xfeff; -12 & # xfeff; -31 и 1999 & # xfeff; -01 & # xfeff; - 01, было бы два вхождения каждого значения в пределах диапазона 915: «hairsp;», «148», «hairsp;», «800» # «xff1c;», ##feff; & # xff1d; x & # xff1c; 915 & hairsp; & # xfeff; 148 & hairsp; & # xfeff;? 801

Ответы [ 3 ]

10 голосов
/ 23 августа 2012

Отметка времени UNIX, как вы понимаете из time () в PHP, является своеобразным чудовищем.

Мне потребовалось много времени, чтобы понять это, но в результате скачка отметки времени увеличивается во время скачкасекунда, и когда високосная секунда заканчивается, метка времени (но не UTC!) возвращается на одну секунду назад.

Это имеет некоторые важные последствия:

  • Вы всегда можете точно преобразоватьиз UTC в метку времени UNIX
  • Вы можете не всегда (для всех точек времени) конвертировать из метки времени в UTC
  • Метка времени Unix не является смежной, т.е.назад.(Или, в качестве альтернативы, он остается тем же без увеличения в течение 2 секунд.)
  • Если вы получите ошибку преобразования, конвертирующуюся из метки времени UNIX в UTC, ошибка будет не более чем на 2 секунды.(Это означает, что вы можете получить неправильный день.)
  • В ретроспектива метка времени Unix будет выглядеть линейной.Это означает, что если вы храните данные временных рядов и вас не заботит неправильное представление одной или двух секунд в год, то вы можете считать хранимые данные с метками времени непрерывными.

Обходные пути

Что если метка времени Unix не отскочила назад и не осталась прежней в течение 2 секунд?Это именно то, что Google сделал для своих серверов.Их решение состояло в том, чтобы медленно искажать время, равное всего лишь миллисекундам, за время в течение длительного периода времени, чтобы сделать високосную секунду практически незаметной для приложений.(Что касается приложений и операционных систем на серверах Google, дополнительные секунды больше не вставляются IERS .)

8 голосов
/ 16 октября 2011

PHP - серверный язык.Функция time () преобразуется в системное время этого сервера.Если на сервере запущен демон NTP, он будет осведомлен о дополнительных секундах и настроен соответствующим образом.PHP не знает об этом, но система знает.

1 голос
/ 16 октября 2011

time() просто возвращает UNIX-метку времени. Это означает, что на него не влияют високосные секунды (и тому подобное), потому что вы никогда не будете «терять» время только потому, что кто-то это решил. Затрагиваются только текстовые представления (например, созданные с использованием date()).

...