我正在编写一个基于日历的Web应用程序,正在编写一些代码,这些代码将循环X次,并计算出开始/结束日期和时间。未来事件的时代。每个事件都有一个开始日期/时间和一个结束日期/时间循环运行完全正常,直到2037年,此时循环停止功能正常。转换永远不会发生,并将我的日期恢复到1969年。请参阅下面的代码和输出。有人能告诉我为什么会这样吗?
问题行为的实例:http://codepad.org/h5ET3h2O
$date1 = strtotime('August 17 2011 8:00 AM');
for ($x=1; $x<=$repeatTimes; $x++){
echo date('m/d/Y g:i A', $date1)."<br><br>".$date1 ." +". $repeatFreq." ".$repeatUnit. " = ";
$date1 = strtotime(date('m/d/Y g:i A', $date1) . " +".$repeatFreq." ".$repeatUnit );
echo $date1."<br /><br />";
}
输出
08/15/2011 8:00 AM
1313409600 +1 Year = 1345032000
08/15/2012 8:00 AM
1345032000 +1 Year = 1376568000
08/15/2013 8:00 AM
1376568000 +1 Year = 1408104000
//Some Left Out
08/15/2036 8:00 AM
2102414400 +1 Year = 2133950400
//Problem starts here
08/15/2037 8:00 AM
2133950400 +1 Year =
12/31/1969 7:00 PM
+1 Year = 31536000
12/31/1970 7:00 PM
31536000 +1 Year = 63072000
12/31/1971 7:00 PM
63072000 +1 Year = 94694400
12/31/1972 7:00 PM
94694400 +1 Year = 126230400
12/31/1973 7:00 PM
126230400 +1 Year = 157766400
12/31/1974 7:00 PM
157766400 +1 Year = 189302400
//Some Left Out
更新
我能够利用DateTime类来使日期正常工作。
for ($x=1; $x<=$repeatTimes; $x++){
$date1->modify(" +".$repeatFreq." ".$repeatUnit);
$sDates[]=$date1->format('m/d/Y g:i A');
}
答案 0 :(得分:6)
http://en.wikipedia.org/wiki/Unix_time
您正在达到32位整数的最大值。
时间测量为自1970年1月1日UTC以来的秒数。你看到1969年,因为在你的时区,就是这样的时候。当秒数溢出32位int时,它会循环回来。
您可以使用以下方法确认最大整数值:echo PHP_INT_MAX;
。
如果你想要64位整数,你需要使用64位硬件和64位版本的PHP(通常这些天,你必须compile yourself,因为我不相信官方二进制文件在PHP.net上可用。)
还有其他选择。见这里:how to have 64 bit integer on PHP?
编辑:根据Maerlyn的建议,您应该考虑使用DateTime class built into recent versions of PHP。它应该可以解决这个问题,只要你一直使用它。