在PHP中获取两个日期之间包含的所有月份

3
这个问题看起来与之前关于月份的问题类似,但我有一个特殊的问题。 我不是试图计算两个日期之间的月份,而是试图获取包含在两个日期中的月份。 我解释一下。我有两个日期:

$begin = new DateTime( '2014-07-20' );
$end = new DateTime( '2014-10-10' );

在这两个日期之间,我有四个月的时间:7月、8月、9月和10月。但是我使用的脚本只能找到三个月,而不是四个。以下是该脚本代码:

$interval = DateInterval::createFromDateString('1 month');

$period = new DatePeriod($begin, $interval, $end);
$counter = 1;

foreach($period as $dt) {
    echo $dt->format( 'm' );
    $counter++;
}

echo $counter;

如何在循环中计算所有4个月?

我希望能够循环遍历所有这些月份。 - pollux1er
你的示例仅适用于$begin中的日期小于$end中的日期的情况。简单的解决方案是将$begin中的日期设置为该月的第一天,并将$end中的日期设置为不是第一天(第二天,第三天或最后一天)的任何一天。修改后的代码示例。 - Glavić
4个回答

6
您可以使用简单的while()循环来实现这一点:
$begin = new DateTime('2014-07-20');
$end = new DateTime('2014-10-10');

while ($begin <= $end) {
    echo $begin->format('Y-m'), "\n";
    $begin->modify('first day of next month');
}

demo


谢谢Glavic,这非常优雅...而且它运行得非常好! - pollux1er
如果$begin>$end,则不显示任何内容。因此,如果您想获得一个月中的列表,您需要进行一些更正:$begin = (new DateTime('2014-07-20'))->modify('first day of this month'); $end = new DateTime('2014-07-01'); 对于这种情况,它将显示“2014-07”。 - Sergey Beloglazov

1
<?php
$begin = new DateTime( '2014-07-20', new DateTimeZone('Europe/Paris') );
$end = new DateTime( '2014-10-10', new DateTimeZone('Europe/Paris') );
$end->add(new DateInterval("P1M"));
$interval = DateInterval::createFromDateString('1 month');

$period = new DatePeriod($begin, $interval, $end);
$counter = 0;

foreach($period as $dt) {
    echo $dt->format( 'm' );
    echo "\n";
    $counter++;
}

echo $counter;

看起来有点棘手,但它应该适用于任何日期(虽然我没有进行过大量测试)。我只是在$end日期上添加了一个月,以便考虑到您想要获取特定日期间隔中包含的所有月份。


好的,但是如果你使用foreach循环,你会发现问题仍然存在 @Lgt - pollux1er
这里的问题在于时间间隔似乎将30天计算为一个月,而没有告诉我这个时间间隔包含哪些月份。 - pollux1er
现在好了吗?我还没有进行过大量测试,但它可以工作。 - GeoffreyB
似乎对于2014年7月1日至2014年9月30日无法正常工作...你能测试一下吗?它说是4个月,但实际上只有3个月。 - pollux1er
似乎唯一真正循环月份的方法是循环区间内的天数并获取月份。 - pollux1er
显示剩余2条评论

0
$begin = strtotime('2014-07-00');
$end= strtotime('2014-10-00');
$y1 = date('Y', $begin);
$y2 = date('Y', $end);
$m1 = date('m', $begin);
$m2 = date('m', $end);
$diff = (($y2 - $y1) * 12) + ($m2 - $m1);

0

对我来说,这不是最优的解决方案,但它运行良好:

$begin = new DateTime( '2014-07-20' );
$end = new DateTime( '2014-10-10' );
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);

$months = array();
foreach($period as $dt) {
    if(!in_array($dt->format( "m" ), $months)) {
        $months[] = $dt->format( "m" );
        echo  $dt->format( "m" );
        echo '<br>';
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接