PHP定义的常量和mktime()不一致


PHP Defined Constant and mktime() Do Not Agree

我试图为给定的主机环境建立一个最大时间戳设置,并设置该值的常量。我写了以下内容:

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秒太小了。

Then I try:

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

该条件解析为false。如果我代入253402300799,它将解析为true。

最后,我试了:

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

我得到了预期的答案:

253402318799

我难住了。我对常数有什么不理解的?

我很确定这是一个时区问题。如果你把这两个语句放在一起,它就可以工作了:

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()代替。