PHP: Loop through all months in a date range?

后端 未结 7 1045
误落风尘
误落风尘 2020-12-02 13:32

If I have a start date (say 2009-02-01) and an end date (say 2010-01-01), how can I create a loop to go through all the dates (months) in the range

相关标签:
7条回答
  • 2020-12-02 13:44

    I like the simplicity of the accepted answer, but as 3s2ng, it doesn't always work. So I tweeked it like this:

        $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);
        }
    
    0 讨论(0)
  • 2020-12-02 13:47
    $start = strtotime('2011-09-01');
    $end = strtotime('2013-12-01');
    while($start < $end)
    {
        echo date('F Y', $start) . '<br>';
        $start = strtotime("+1 month", $start);
    }
    
    0 讨论(0)
  • 2020-12-02 13:52

    Based on Gordon's response this is the way I actually work when you need to get all the months between.

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

    This is the result if I execute this code now:

    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
    

    Notice that this doesn't include the current month. If you need to include current month, you can set the "$end" variable to the first day of the next month.

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

    Hope this helps, greetings.

    0 讨论(0)
  • 2020-12-02 13:56

    Example of DateTime, DateInterval and DatePeriod class combination :

    $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;
    }
    
    0 讨论(0)
  • 2020-12-02 13:57

    I have a method which is optimal in results :

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

    A plus for the method of @Glavic

    0 讨论(0)
  • 2020-12-02 14:04

    The accepted answer is not the proper way.

    I tried this snippet and it does not work properly. If your start date is the end of the month and the end date is the start of the 3rd month.

    For example: 2014-08-31 - 2014-10-01

    Expected should be.

    • August
    • September
    • October

    The better solution is:

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

    Reference: How to list all months between two dates

    0 讨论(0)
提交回复
热议问题