【问题标题】:iterating through dates doesnt display the 31st of the month遍历日期不显示该月的 31 日
【发布时间】:2017-09-01 19:12:32
【问题描述】:

我有这个代码要迭代一个月

$begin2 = new DateTime( '2017-08-01' );
$end2 = new DateTime( '2017-08-31' );
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin2, $interval, $end2);
foreach ( $period as $i ){  
    echo $i->format("Y-m-d")."<br/>";
}

我也试过这个:

$begin = new DateTime( '2017-08-01' );
$end = new DateTime( '2017-08-31' );
 for($i = $begin; $begin <= $end; $i->modify('+1 day')){
    echo $i->format("Y-m-d")."<br/>";
 }

我得到了相同的结果,它跳过了 8 月 31 日,它确实适用于其他月份,我很困惑,不知道会发生什么。

【问题讨论】:

  • 您的第二个示例确实包括第 31 个。您的第一个示例没有,因为当下一个 DateTime 大于或等于结束 DateTime 时,DatePeriod 停止:为了帮助解决这个问题,您可以将结束值设置为稍后比该期间所需的时间,例如对你来说,这个时期想要达到2017-08-31 00:00:00(午夜),所以使用更晚的日期/时间,比如2017-08-31 00:00:01

标签: php date datetime for-loop


【解决方案1】:

如果您使用 var_dump $period 您会发现问题。
您的结束时间是 8 月 31 日 00:00。

如果您在当天晚些时候设置时间,它将输出日期。

$begin2 = new DateTime( '2017-08-01' );
$end2 = new DateTime( '2017-08-31 12:00' ); //I set the end at noon here. Any time should work except empty or 00:00
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin2, $interval, $end2);
foreach ( $period as $i ){  
    echo $i->format("Y-m-d")."<br/>";
}

https://3v4l.org/1n4W4

【讨论】:

  • 谢谢你让我明白,我做错了什么。竖起大拇指
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多