PHP 5.3+ DateTime类问题

时间:2011-12-30 17:21:26

标签: php datetime

我正在尝试使用PHP变量为给定日期创建基本选择菜单。日期将选择当前月份的第1天,并根据其他系统规则减去要显示的给定月数。我遇到了一个错误但不确定原因。我完全打破了我的HTML,只是为了测试这个类。以下是我的发现:

代码

<?php 
    $date = new DateTime(date('Y').'-'.date('m').'-01'); 
    $date_now = $date->format('Y-m-d');
    $date->sub(new DateInterval('P12M'));
    $end_date = $date->format('Y-m-d');

    echo '1: '. $date_now. ' - '.strtotime($date_now).'<br />'; //works
    echo '2: '. $end_date. ' - '.strtotime($end_date).'<br />'; //works
    echo '3: '. $date_now = date("Y-m-d", strtotime("-1 month", strtotime($date_now))).'<br />'; //works
    echo '4: '. strtotime($date_now).'<br />'; //does not give any response
    echo '5: '. $date_now = date("Y-m-d", strtotime("-1 month", strtotime($date_now))).'<br />'; //does not work
    echo '6: '. $date_now; //does not work
    exit;
?>

结果

  

1:2011-12-01 - 1322719200

     

2:2010-12-01 - 1291183200

     

3:2011-11-01

     

4:

     

5:1969-12-01

     

6:1969-12-01

正如你所看到的 - 声明4根本不回应,而5/6看似不正确。有关为什么会发生这种情况的任何想法?是否与返回DateTime结果的方式有关?

1 个答案:

答案 0 :(得分:2)

在你的第三个回显中,当你为$ date_now分配一个新值时,你正在连接到日期字符串,这导致strtotime()在下一行失败。

不过,您在前几行中使用的是DateInterval类,但脚本中没有进一步使用。有什么理由吗?

此外,您应该投资调试器(ZendDebugger或xDebug是两个最受欢迎的调试器)。我使用调试器在大约30秒内发现了这个错误......

编辑:在回复OP的评论时,您仍然可以使用DateTime类来执行while语句:

while( $date_now >= $end_date ) {
   echo ...;
   $date_now->sub(new DateInterval('P1M'));
}

但是你可能需要确保在创建结束日期时克隆DateTime对象,否则你将永远从1年前开始循环回来......