Функция MKTime возвращает неправильное время?
Вопрос
У меня возникли проблемы с функцией mktime.На моем рабочем сервере, если я выполню следующее:
echo '<p>' . mktime(24, 0,0, 8,29,2009) . ' - 12pm</p>';
echo '<p>' . mktime(23, 0,0, 8,29,2009) . ' - 11pm</p>';
echo '<p>' . mktime(22, 0,0, 8,29,2009) . ' - 10pm</p>';
А затем преобразуйте эти временные метки обратно в читаемый формат (используя www.unixtimestamp.com для быстрого преобразования) время смещено на один час.Первоначально я думал, что это проблема с 2400 против 0000, но это не объясняет отклонения других дат.
Есть идеи?
Решение
Часовой пояс вашего сервера отличается от ожидаемого.Временные метки Unix измеряются в секундах с 1 января 1970 г. 00:00:00. время по Гринвичу, поэтому в вашем коде есть скрытое преобразование часового пояса.Вы также можете
- использовать
gmmktime()
чтобы создать временную метку для даты по Гринвичу, - используйте встроенный Класс даты и времени,
- исправить настройки часового пояса в php.ini, или
- установите часовой пояс для использования с функцией
date_default_timezone_set()
.
Другие советы
Я просто запустил следующее из командной строки и получил следующий (ожидаемый) вывод.Что произойдет, если вы запустите их?
$ php -r "echo date('H:i:s Y-m-d', mktime(24, 0, 0, 8, 29, 2009));"
00:00:00 2009-08-30
$ php -r "echo date('H:i:s Y-m-d', mktime(23, 0, 0, 8, 29, 2009));"
23:00:00 2009-08-29
$ php -r "echo date('H:i:s Y-m-d', mktime(22, 0, 0, 8, 29, 2009));"
22:00:00 2009-08-29
Моя проблема заключалась в том, что в mktime
Я ввожу день и месяц с помощью ведущие нули.Затем функция вернула мне неправильные результаты.Одним из вариантов было бы удалить ведущий ноль с помощью такой функции, как
$str = ltrim($str, '0');
Источник: Как удалить все ведущие нули в строке
или
$var = (int)$var;
Источник: PHP удаляет первые нули
Я использовал одну возможность из Soulmerge:
$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds);
$match_time = $date->getTimestamp();
Но часовой пояс должен быть всегда установлен (либо с помощью date_default_timezone_set()
или напрямую с DateTime
.