Является ли время () гарантированным знаком прыжка?

Руководство PHP указывает, что time() возвращает & puncsp; " текущая временная метка UNIX " ᴀ & puncsp; и microtime() возвращает « текущую временную отметку Unix с микросекундами » и «puncsp;» .

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

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

Например, если мы проводим опрос time() & hairsp; | & hairsp; microtime() каждые микросекунды на протяжении всего периода 1998 -12 -31 и 1999 -01 -01, было бы два появления каждого значения в диапазоне 915 & hairsp; 148 & hairsp; 800 <= x <915 & hairsp; 148 & hairsp; 801?

Solutions Collecting From Web of "Является ли время () гарантированным знаком прыжка?"

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

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

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

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

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

обходные

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

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