PHP找出重复事件的未来日期 - 只能工作到2037年?

时间:2011-08-08 16:12:13

标签: php date strtotime

我正在编写一个基于日历的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');
}

1 个答案:

答案 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。它应该可以解决这个问题,只要你一直使用它。