Функция 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 VS 0000, но это не объясняет, что другие даты не работают.

Есть идеи?


person Cory Dee    schedule 13.07.2009    source источник


Ответы (3)


Ваш сервер имеет другой часовой пояс, чем вы ожидаете. Временные метки Unix измеряются в секундах с 00:00:00 GMT 1.1.1970, поэтому в коде используется скрытое преобразование часовых поясов. Вы также можете

person soulmerge    schedule 13.07.2009
comment
Я установил свой часовой пояс по умолчанию, который не был установлен. Дальнейшее расследование выглядит так, как будто я поторопился, метка времени прекрасно преобразуется вперед и назад, и она прекрасно попадает в БД. Похоже проблема только в отображении. Спасибо за помощь. - person Cory Dee; 13.07.2009

Я просто запустил следующее из командной строки и получил следующий (ожидаемый) результат. Что произойдет, если вы их запустите?

$ 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
person TJ L    schedule 13.07.2009

Моя проблема заключалась в том, что в mktime я ввожу день и месяц с начальными нулями. Чем функция вернула мне неправильные результаты. Одним из вариантов было бы удалить начальный ноль с помощью такой функции, как

$str = ltrim($str, '0');

Источник: Как удалить все ведущие нули в строке

or

$var = (int)$var;

Источник: PHP удаляет первые нули

Я использовал одну возможность из soulmerge:

$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds);
$match_time = $date->getTimestamp();

Но часовой пояс всегда должен быть установлен (либо с помощью date_default_timezone_set()< /a> или непосредственно с помощью DateTime.

person testing    schedule 07.08.2013
comment
Хотя это и не виновник ОП, стоит отметить это как возможную ловушку. - person johnsnails; 15.09.2014