PHP:在日期范围内循环播放所有月份?

时间:2010-01-28 14:24:07

标签: php date loops php4

如果我有一个开始日期(比如说2009-02-01)和一个结束日期(比如说2010-01-01),我怎样才能创建一个循环来遍历范围内的所有日期(月)? / p>

7 个答案:

答案 0 :(得分:74)

尝试

$start = $month = strtotime('2009-02-01');
$end = strtotime('2011-01-01');
while($month < $end)
{
     echo date('F Y', $month), PHP_EOL;
     $month = strtotime("+1 month", $month);
}

记下笔记http://php.net/manual/de/datetime.formats.relative.php

  

相对月份值是根据它们经过的月份长度计算的。一个例子是“+ 2个月2011-11-30”,这将产生“2012-01-30”。这是因为11月份为30天,12月为31天,共计61天。

从PHP5.3起,您可以使用http://www.php.net/manual/en/class.dateperiod.php

答案 1 :(得分:34)

DateTimeDateIntervalDatePeriod班级组合的示例:

$start = new DateTime('2009-02-01');
$interval = new DateInterval('P1M');
$end = new DateTime('2011-01-01');
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format('F Y') . PHP_EOL;
}

答案 2 :(得分:19)

接受的答案不是正确的方法。

我尝试了这个代码段并且无法正常运行。如果您的开始日期是月末,而结束日期是第3个月的开始日期。

例如:2014-08-31 - 2014-10-01

预计应该是。

  • 八月
  • 九月
  • 十月

更好的解决方案是:

$start    = new DateTime('2010-12-02');
$start->modify('first day of this month');
$end      = new DateTime('2012-05-06');
$end->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format("Y-m") . "<br>\n";
}

参考:How to list all months between two dates

答案 3 :(得分:2)

$start = strtotime('2011-09-01');
$end = strtotime('2013-12-01');
while($start < $end)
{
    echo date('F Y', $start) . '<br>';
    $start = strtotime("+1 month", $start);
}

答案 4 :(得分:2)

我喜欢接受的答案的简单性,但作为3s2ng,它并不总是有效。所以我这样推文:

    $start = strtotime('2009-02-01');
    $startmoyr = date('Y', $start) . date('m', $start);
    $end = strtotime('2013-12-01');
    $endmoyr = date('Y', $end) . date('m', $end);

    while ($startmoyr <= $endmoyr) {
        echo date("F Y", $start) . "<br>";
        $start = strtotime("+1month", $start);
        $startmoyr = date('Y', $start) . date('m', $start);
    }

答案 5 :(得分:1)

我有一个结果最佳的方法:

$begin = new DateTime( '2014-07-14' );
$end = new DateTime( '2014-08-01' );
$end = $end->modify( '+1 month' );
$interval = DateInterval::createFromDateString('1 month');

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

foreach($period as $dt) {
    var_dump($dt->format( "m" ));
}

@Glavic

方法的加号

答案 6 :(得分:0)

根据戈登的回答,这是我实际需要的工作方式您需要在这两个月之间的所有时间

$end = strtotime(date("Y-m-01"));
$start = $month = strtotime("-12 months", $end);

while ( $month < $end ) {
    echo date("Y-m-d", $month));
    $month = strtotime("+1 month", $month);
}

如果我现在执行此代码,则结果如下:

2018-05-01
2018-06-01
2018-07-01
2018-08-01
2018-09-01
2018-10-01
2018-11-01
2018-12-01
2019-01-01
2019-02-01
2019-03-01
2019-04-01

请注意,这不包括当前月份。如果需要包括当前月份,可以将“ $ end”变量设置为下个月的第一天。

$current_first_day_of_the_month = date("Y-m-01");
$end = strtotime("$current_first_day_of_the_month +1 month");
$start = $month = strtotime("-12 months", $end);

希望这会有所帮助,问候。