Я пытаюсь сделать очень базовую математику времени – в основном, учитывая входы времени и расстояния, вычислить скорость. Я решил использовать 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());