我试图为给定的主机环境建立一个最大时间戳设置,并设置该值的常量。我写了以下内容:
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()
代替。