2009-07-13 2 views
1

У меня проблемы с функцией 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, но это не повлияло бы на другие даты.

Любые идеи?

ответ

5

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

+0

Я установил свой часовой пояс по умолчанию, который не был установлен. Дальнейшее исследование выглядит так, как будто я прыгнул с пистолета, метка времени преобразуется вперед и назад просто отлично, и это делает его в БД просто прекрасным. Кажется, это только проблема с отображением. Спасибо за помощь. –

0

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

$ 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 
0

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

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

Источник: How to remove all leading zeroes in a string

или

$var = (int)$var; 

Источник: PHP remove first zeros

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

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

Но часовой пояс всегда должен быть установлен (либо с date_default_timezone_set(), либо непосредственно с DateTime.

+0

Пока не виновник OP, стоит отметить это как возможное падение ямы. – johnsnails

Смежные вопросы