【问题标题】:Get all months included between two dates in PHP [duplicate]获取PHP中两个日期之间包含的所有月份[重复]
【发布时间】:2014-09-10 08:48:50
【问题描述】:

这个问题似乎与一个月左右的旧问题相似,但我有一个特殊问题。 我不想计算两个日期之间的月份,但我试图将月份包含在两个日期中。 我解释。我有 2 个日期:

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

在这两个日期之间,我有 4 个月包括:7 月、8 月、9 月、10 月。 但是使用我正在使用的脚本,我找不到包含 4 个月但只有 3 个月的脚本。这是脚本:

$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 个月?

【问题讨论】:

  • 我希望在这几个月里循环播放
  • 您的示例仅适用于 $begin 中的 day 小于 $end 中的 day 的情况。简单的解决方案是将 $begin 中的日期设置为每月的第一天,并将 $end 中的日期设置为不是第一天(第二天、第三天或最后一天)的任何一天。 Example of your modified code.

标签: php date datetime


【解决方案1】:

您可以通过简单的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,这非常优雅……而且效果很好!
  • 感谢 Glavic。这很有帮助
【解决方案2】:
<?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
  • 这里间隔的问题是,它似乎是计算30天相当于几个月,它并没有告诉我间隔中的月份。
  • 现在好点了吗?我没有对它进行很多测试,但它确实有效。
  • 是的!谢谢光 ;)
  • 它似乎不适用于 2014-07-01 到 2014-09-30 ... 你能测试一下吗?它说 4 个月,但它只有 3
【解决方案3】:
$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);

【讨论】:

    【解决方案4】:

    对我来说,这不是最佳解决方案,但效果很好:

    $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>';
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      相关资源
      最近更新 更多