Константа, определенная в PHP, и mktime() не согласны

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

define('SC_TIME_END_OF_64', mktime(23, 59, 59, 12, 31, 9999));

Если я затем покажу два значения в системе, которая, как известно, имеет 64-битные целые числа и 64-битное время:

echo SC_TIME_END_OF_64 . ' ' . mktime(23, 59, 59, 12, 31, 9999);

Я получил:

253402300799 253402318799

Моя константа на 18000 секунд слишком мала.

Затем я попробовал:

if (mktime(23, 59, 59, 12, 31, 9999) == 253402318799) {

Это условие принимает значение false. Если я заменю 253402300799, это будет верно.

Наконец, я попробовал:

$time_64 = mktime(23, 59, 59, 12, 31, 9999);
echo $time_64;

И получаю ожидаемый ответ:

253402318799

Я в тупике. Что я не понимаю в константах?


person Will Fastie    schedule 19.08.2014    source источник
comment
Какие настройки часового пояса у вашего сервера? и вы меняете их в своем коде? Попробуйте то же упражнение с gmmktime() - when called with no arguments, gmmktime() uses the current GMT time, and mktime() uses the current local time   -  person Mark Baker    schedule 19.08.2014


Ответы (1)


Я совершенно уверен, что это проблема часового пояса. Если вы сделаете два утверждения рядом друг с другом, это сработает:

define('SC_TIME_END_OF_64', mktime(23, 59, 59, 12, 31, 9999));
echo SC_TIME_END_OF_64 . ' ' . mktime(23, 59, 59, 12, 31, 9999);
//253402329599 253402329599

http://sandbox.onlinephpfunctions.com/code/73e441ef17890152380b6c875157596e0287a1b6

Но если вы измените часовой пояс в какой-то момент между ними, вы получите разные результаты:

define('SC_TIME_END_OF_64', mktime(23, 59, 59, 12, 31, 9999));
date_default_timezone_set('Europe/Amsterdam');
echo SC_TIME_END_OF_64 . ' ' . mktime(23, 59, 59, 12, 31, 9999);
//253402329599 253402297199

http://sandbox.onlinephpfunctions.com/code/795bede12ac82b69b360bf8cae9bcd9eebc2ebf4

Либо стандартизируйте часовой пояс (в идеале UTC), либо используйте вместо него gmmktime().

person dave    schedule 19.08.2014
comment
Спасибо. Часовой пояс устанавливается позже в коде, и, поскольку он не находился рядом с местом, где я создал константу, я его пропустил. 18000 секунд - это 5 часов, так что я должен был это понять. - person Will Fastie; 19.08.2014