Intereting Posts
Как отправить изображение на Twitter с помощью php? Я хочу запустить wp_query в отдельном php-файле для вызова ajax Проверьте статус подписки на приложение в Android Как оператор <=> сравнивает объекты? Получение подобной долготы и широты из базы данных Как заменить ширину и высоту тега iframe html с помощью php? Могу ли я высмеять реализацию интерфейса с помощью PHPUnit? Как повторить транзакцию после тупика с помощью Doctrine? php: // ввод может быть прочитан только один раз в PHP 5.6.16 Как изменить порядок значений subarray для создания таблицы с использованием PHP? PHP – поддержка многобайтовых безопасных регулярных выражений Что означают запятые в объявлении переменной? Не удалось найти оболочку «https» – вы забыли включить ее при настройке PHP? Когда filter_input () удаляет слэши переменных POST? Запись в электронную таблицу Документов Google с использованием PHP

Странное поведение PHP time math: Почему strtotime () возвращает отрицательные числа?

Я пытаюсь сделать очень базовую математику времени – в основном, учитывая входы времени и расстояния, вычислить скорость. Я решил использовать strtotime (), чтобы преобразовать временные входы в секунды, но я получаю некоторые причудливые результаты.

Например, учитывая эту примерную программу:

<?php $t1 = strtotime("3:15:00",0); $t2 = strtotime("1:00:00",0); $t3 = strtotime("2:00:00",0); $t4 = strtotime("9:00:00",0); echo $t1 . "\n"; echo $t2 . "\n"; echo $t3 . "\n"; echo $t4 . "\n"; ?> 

Почему я получаю эти результаты?

 $ php test.php -56700 -64800 -61200 -36000 

Обновить:

Поскольку никто не сказал это явно, позвольте мне объяснить ошибку в приведенной выше функции. Я предположил, что переход от нуля к strtotime () заставит его генерировать метки времени, полученные из полуночи, 12/31/1969, UTC – что звучит странно, но будет работать для моих целей.

То, что я не рассчитывал, было то, что strtotime () учитывает часовые пояса при преобразовании строк, а мой сервер, по-видимому, отстает на 5 часов по сравнению с UTC. Кроме того, из-за сдвига часового пояса PHP затем интерпретирует время как относительно дня до эпохи, что означает, что он интерпретирует мои времена как происходящие относительно 30 декабря 1969 года вместо 31-го, что приводит к отрицательным числам. ..

Похоже, что Евгений прав – если я хочу рассчитать только прошедшее время, я не могу использовать встроенные функции времени.

Если вы хотите сделать что-то подобное, я думаю, вы хотите просто сделать некоторую математику в строках времени и преобразовать их в несколько секунд, например:

 <?php function hmstotime($hms) { list($hours, $minutes, $seconds) = explode(":",$hms); return $hours * 60 * 60 + $minutes * 60 + $seconds; } ?> 

По-видимому, с незапамятных времен PHP назначает дату 31 декабря 1969 года. Когда я запустил это:

 echo date('F j, YH:i:s', $t1) . "\n"; echo date('F j, YH:i:s', $t2) . "\n"; echo date('F j, YH:i:s', $t3) . "\n"; echo date('F j, YH:i:s', $t4) . "\n"; 

Я получил это:

 31 декабря 1969 г. 03:15:00
 31 декабря 1969 года 01:00:00
 31 декабря 1969 г. 02:00:00
 31 декабря 1969 года 09:00:00

Помните, что strtotime возвращает strtotime метку UNIX, которая определяется как количество секунд с 1 января 1970 года. По определению, временная метка UNIX относится к определенному месяцу / дню / году, поэтому, несмотря на то, что имя strtotime самом деле не предназначено для голых периодов без даты.

Поскольку strtotime () выводит количество секунд относительно второго аргумента (в вашем случае – эпоха Unix (31 декабря 1969 19:00:00)).

Отрицательные числа ожидаются, потому что «3:15:00» – 56700 секунд до эпохи Unix.

strtotime() без второго аргумента получает время из предоставленной строки и заполняет пробелы с текущей даты:

 echo date('Ymd H:i:s', strtotime("3:15:00")); -> 2009-06-30 03:15:00 

Со вторым аргументом он вычисляет дату относительно второго аргумента:

 echo date('Ymd H:i:s', strtotime("3:15:00", 0)); -> 1970-01-01 03:15:00 

Чтобы вычислить разницу между двумя временными метками в секундах, вы можете просто сделать это:

 echo strtotime("3:15:00") - strtotime("3:00:00"); -> 900 

Редактирование: Конечно, учитывая, какое большее число:

 $t1 = strtotime("3:15:00"); $t2 = strtotime("3:30:00"); $diff = max($t1, $t2) - min($t1, $t2); $diff = abs($t1 - $t2); 

Или что-то в этом роде …

Попробуйте его без второго параметра. Это должно быть временная метка для возвращаемого времени, чтобы быть относительно. Предоставление 0 означает, что вы запрашиваете временную метку относительно эпохи Unix.

В ответ на ваш комментарий:

Это не документированная функциональность, но я все время использую strtotime("HH:MM") и возвращает временную метку относительно текущего времени. Я думаю, если вы хотите быть уверенным, что вы можете сделать это:

 strtotime("3:15:00",time());