@Dreaded

Почему date неправильно конвертирует временную метку?

Суть задачи такова: вывести сколько часов и минут осталось до начала следующих суток.
Казалось бы, что может быть проще? Берем завтрашнюю временную метку, отнимаем нынешнюю, и конвертируем в удобочитаемый вид.
date_default_timezone_set("Europe/Moscow");
$timer = date ("H:i" , (strtotime("tomorrow") - strtotime("now"));


Результат выполнения этого кода 09:59 ,
хотя
$timer = strtotime("tomorrow") - strtotime("now")
корректно отображает 25162.

Делим на количество секунд в часе : 25162 \ 3600 = 6,99. Всё верно , на момент написания (17:02) до начала новых суток осталось почти 7 часов.

Вопрос: что я делаю не так и почему date ("H:i" , (strtotime("tomorrow") - strtotime("now")); показывает время на три часа больше ?
  • Вопрос задан
  • 417 просмотров
Решения вопроса 1
Проблема в установленной временной зоне.
При UTC функция date(...) отображала бы 06:59, но прибавляет 3 часа так как установлена зона Europe/Moscow.

Я бы порекомендовал воспользоваться библиотекой Carbon либо встроенной DateTime, либо gmdate:

date_default_timezone_set("Europe/Moscow");

Carbon\Carbon::now()->diff(Carbon\Carbon::tomorrow())->format("%H:%I")
// 06:38

(new DateTime("now"))->diff(new DateTime("tomorrow"))->format("%H:%I")
// 06:38

gmdate("H:i", strtotime("tomorrow") - strtotime("now"));
// 06:38
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dreaded Автор вопроса
Проблема, действительно в установленной временной зоне. На сколько я понял, если мы устанавливаем временную зону Moscow, то strtotime("tomorrow") возвращает нам временную метку с учетом временной зоны, а date(), в свою очередь просто прибавляет +3 часа. Пока, дабы этого избежать, в голову пришло только указать перед вызовом date() временную зону UTC.

date_default_timezone_set("Europe/Moscow");
$time_diff = strtotime("tomorrow") - strtotime("now");
date_default_timezone_set("UTC");
$timer = date("H:i", $time_diff);

Есть еще варианты решения этой проблемы(не прибегая к классу DateTime)?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы