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

Dut*_*432 1 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 />";


}
Run Code Online (Sandbox Code Playgroud)

产量

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
Run Code Online (Sandbox Code Playgroud)

UPDATE

我能够利用DateTime类来使日期正常工作.

for ($x=1; $x<=$repeatTimes; $x++){
    $date1->modify(" +".$repeatFreq." ".$repeatUnit);
    $sDates[]=$date1->format('m/d/Y g:i A');
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*rad 6

http://en.wikipedia.org/wiki/Unix_time

您正在达到32位整数的最大值.

时间以自1970年1月1日UTC以来的秒数来衡量.你看到1969年,因为在你的时区,就是这样的时候.当秒数溢出32位int时,它会循环回来.

您可以使用以下命令确认最大整数值: echo PHP_INT_MAX;.

如果你想要64位整数,你需要使用64位硬件和64位版本的PHP(通常这些天你必须自己编译,因为我不相信PHP上有官方二进制文件.净但).

还有其他选择.看这里: 如何在PHP上使用64位整数?

编辑:根据Maerlyn的建议,您应该考虑使用最新版本的PHP内置DateTime类.它应该可以解决这个问题,只要你一直使用它.

  • 我还要添加使用php的DateTime类的提示,该类在2038年后运行. (2认同)