2016-03-18 4 views
2

Я работаю над некоторыми функциями, связанными со временем, и я предпочитаю всегда использовать время UTC и хранить метки времени как целые числа для согласованности.PHP mktime и часовой пояс

Однако, я заметил, что когда я использую mktime, кажется, что установленный часовой пояс имеет влияние возвращаемого значения mktime. Из документации Я понимаю, что mktime должна возвращать количество секунд с начала эпохи:

Возвращает метку времени Unix, соответствующие аргументы. Эта временная метка представляет собой длинное целое число, содержащее количество секунд между эпохи Unix (1 января 1970 года 00:00:00 по Гринвичу) и указанное время.

http://php.net/manual/en/function.mktime.php

Тем не менее, кажется, что mktime в том числе часовой пояс, который в настоящее время установлен. При использовании следующего кода:

date_default_timezone_set('UTC'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

date_default_timezone_set('Australia/Sydney'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

я ожидал бы два времени VALES быть такими же, но, видимо, они не являются:

1451606400 
1451566800 

который, кажется, exacly 11 часов разница:

1451606400 - 1451566800 = 39600/(60*60) = 11 

Что я не понимаю правильно о mktime и/или почему учетный пояс принимается во внимание при использовании mktime?

ответ

5

Я не могу сказать вам, почему это так оно и есть (PHP никогда не имела смысла для меня, когда речь идет о дате и времени), но есть альтернативная функция gmmktime() которая

Идентичный mktime(), за исключением того, что прошедшие параметры представляют собой дату GMT. gmmktime() внутренне использует mktime(), поэтому могут использоваться только времена, действующие в производном локальном времени.

Существует также comment on the PHP documentation for this function, который объясняет, как mktime(), gmmktime() и time() работу. По существу, они предполагают, что вы всегда думаете в часовых поясах, даже если сама временная метка UNIX не имеет часового пояса.

+1

Ouch. Это ужасно. Все, что им нужно было сделать, - всегда использовать UTC во всех временных функциях и включать только часовой пояс при «отображении» времени. Думаю, так оно и есть из-за «истории» PHP ... Спасибо за ваш ответ! – Luke

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