php DatePeriod不会按预期返回2天

时间:2014-01-22 11:59:18

标签: php date datetime

我试着在一段时间内得到所有的日子。无论是一整天还是几个小时都没关系。我使用DatePeriod的当前代码对我不起作用。

示例:

[start] => DateTime Object
    (
        [date] => 2014-01-27 22:40:40
        [timezone_type] => 1
        [timezone] => +00:00
    )

[end] => DateTime Object
    (
        [date] => 2014-01-28 17:40:40
        [timezone_type] => 1
        [timezone] => +00:00
    )

$interval = new DateInterval('P1D'); // 1Day Interval
$daterange = new DatePeriod($time['start'], $interval ,$time['end']);

$return['days'] = array();

foreach($daterange as $date){
    $return['days'][] = $date->format("Y-m-d");
}

我想得到

[0] => 2014-01-27
[1] => 2014-01-28

但我只得到了

[0] => 2014-01-27

是否可以更改DatePeriod参数或其他内容?

2 个答案:

答案 0 :(得分:10)

DatePeriod对象忽略上一个句点。您可以通过按间隔增加结束日期来解决此问题:

$interval = new DateInterval('P1D');
$start->setTime(0, 0);
$end->setTime(0, 0)->add($interval);
$periods = new DatePeriod($start, $interval, $end);

demo

更新:删除(设置为00:00:00)开始日期和结束日期的时间部分,如果您只是在几天内循环。

答案 1 :(得分:3)

你违反了DatePeriod忽略最后一个时期的事实。您可以通过在Glavic suggests添加DatePeriod来解决这个问题,或者,您可以使用要添加的间隔数来构造DatePeriod,在给定的示例中为1: -

$interval = new DateInterval('P1D'); // 1Day Interval
$daterange = new DatePeriod($time['start'], $interval , 1);

$return['days'] = array();

foreach($daterange as $date){
    $return['days'][] = $date->format("Y-m-d");
}

See it working

Glavic的答案是最好的选择,你应该接受这一点,我只是想向你展示一个替代方案,因为他像往常一样快速得到答案:)