PHP mktime и часовой пояс

Я работаю над некоторыми функциями, связанными со временем, и я предпочитаю всегда использовать время 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?

2

Решение

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

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

Также есть прокомментируйте PHP документацию для этой функции что объясняет как mktime(), gmmktime() а также time() Работа. По сути, они предполагают, что вы всегда думаете о часовых поясах, даже если сама отметка времени UNIX не содержит часовой пояс.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]