web-dev-qa-db-ja.com

PHP:日付範囲内のすべての月をループしますか?

開始日がある場合(たとえば2009-02-01)と終了日(たとえば2010-01-01)、範囲内のすべての日付(月)を通過するループを作成するにはどうすればよいですか?

33
JD Isaacks

試して

$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 を使用できます

77
Gordon

DateTimeDateInterval および DatePeriod クラスの組み合わせの例:

$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;
}
34
Glavić

受け入れられた答えは適切な方法ではありません。

このスニペットを試してみましたが、正しく動作しません。開始日が月の終わりで、終了日が3か月目の始まりである場合。

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

期待されるはずです。

  • 8月
  • 九月
  • 10月

より良い解決策は次のとおりです。

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

参照: 2つの日付間のすべての月をリストする方法

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

私は受け入れられた答えのシンプルさが好きですが、3s2ngとしては、常にうまくいくとは限りません。だから、私はこのようにそれをtweeked:

    $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);
    }
2
Mark

結果に最適な方法があります:

$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のメソッドのプラス

1
pollux1er

ゴードンの応答に基づいて、これが実際に働く方法ですその間すべての月を取得する必要がある場合

$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);

これがお役に立てば幸いです。

0
manuman94