Я работаю над некоторыми функциями, связанными со временем, и я предпочитаю всегда использовать время UTC и хранить метки времени как целые числа для согласованности.
Тем не менее, я заметил, что когда я использую 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";
Я ожидал бы, что два временных долины будут одинаковыми, но, очевидно, они не являются:
1451606400
1451566800
Что, кажется, является разницей в 11 часов:
1451606400 - 1451566800 = 39600 / (60*60) = 11
Что я не правильно понимаю о mktime
и / или почему часовой пояс учитывается при использовании mktime
?
Я не могу сказать вам, почему это так (PHP никогда не имел смысла для меня, когда дело доходит до даты и времени), но есть альтернативная функция gmmktime()
который
Идентично mktime (), за исключением того, что переданные параметры представляют дату по Гринвичу. gmmktime () внутренне использует mktime (), поэтому можно использовать только времена, действительные в производном локальном времени.
Также есть прокомментируйте PHP документацию для этой функции что объясняет как mktime()
, gmmktime()
а также time()
Работа. По сути, они предполагают, что вы всегда думаете о часовых поясах, даже если сама отметка времени UNIX не содержит часовой пояс.
Других решений пока нет …