我正在尝试为给定的托管环境建立最大时间戳设置,并使用该值设置常量。我写了以下内容:
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) {
该条件解决为假。如果我替换253402300799,它将解析为true。
最后,我试过了:
$time_64 = mktime(23, 59, 59, 12, 31, 9999);
echo $time_64;
我得到了预期的答案:
253402318799
我很难过。我不了解常数?
答案 0 :(得分: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()
代替。