Jydon Mah
Jydon Mah

Reputation: 383

Loop Year and Months

How can I loop the year and months with some given dates? Below is my current code and I can't get it running

$Startdate = '2017-01';
$Enddate = '2018-06';

 for($selectedDate = date("Y-m",$begin); $selectedDate <= date("Y-m",$end); $selectedDate++){
    $resultY = date("Y",strtotime($selectedDate));
    $resultM = date("m",strtotime($selectedDate));

    echo $resultY;
    $echo resulthM;
}

The output should be:

2017    1
2017    2
2017    3
2017    4
2017    5
2017    6
2017    7
2017    8
2017    9
2017    10
2017    11
2017    12
2018    1
2018    2
2018    3
2018    4
2018    5
2018    6

Upvotes: 1

Views: 671

Answers (4)

ArtisticPhoenix
ArtisticPhoenix

Reputation: 21661

You can use DateTime::modify and walk the months forward

$Startdate = '2017-01';
$Enddate = '2018-06';

$DateTime = new DateTime($Startdate.'-01');

echo $DateTime->format('Y')."\t".$DateTime->format('n')."\n";

do{
   $DateTime->modify('+1 months');

   echo $DateTime->format('Y')."\t".$DateTime->format('n')."\n";

   if($DateTime->format('Y-m') == $Enddate) break;

}while(true);

Just make sure the Enddate is a valid Year/Month and happens after Startdate or in this example you'll loop forever.

There are probably other ways to do the loop that avoids that.

But I didn't see DateTime::modify used in an answer so I thought I would throw one together.

Output:

2017    1
2017    2
2017    3
2017    4
2017    5
2017    6
2017    7
2017    8
2017    9
2017    10
2017    11
2017    12
2018    1
2018    2
2018    3
2018    4
2018    5
2018    6

Sandbox

I usually use this method when I want to make a select/option for stuff like months. But I use this format str_pad($DateTime->format('n'),2,' ',STR_PAD_LEFT).' - '.$DateTime->format('F') OR ' 2 - February', notice the space on the left ... :) ... that way they all line up nice and neat like.

Anyway, cheers!

Upvotes: 0

Poul D.
Poul D.

Reputation: 57

$startDate = new \DateTime('2017-01-01'); 
$endDate = new \DateTime('2018-06-01');

for($selectedDate = $startDate; $selectedDate <= $endDate; $selectedDate->modify('+1 month')) {
    // format $selectedDate;
    $resultY = $selectedDate->format('Y');
    $resultM = $selectedDate->format('m');

    // print content
    echo $resultY;
    echo "\t";  // print tab
    echo $resultM;
    echo "\n";  // print new line
}

Upvotes: 0

cmprogram
cmprogram

Reputation: 1884

Since you were familiar with strtotime, you can amend your code to the following to execute the desired results.

$begin = date("Y-m", strtotime("2017-01")); // Replace this with date to begin.
$end = date("Y-m"); // Replace this with date to end.

for($selectedDate = date("Y-m", strtotime($begin)); $selectedDate <= date("Y-m", strtotime($end)); $selectedDate = date("Y-m", strtotime($selectedDate . "+1 Month"))){
    $resultY = date("Y", strtotime($selectedDate));
    $resultM = date("m", strtotime($selectedDate));

    echo $resultY;
    echo $resultM;
}

However, equally, user don't angry me, has an answer that will allow you to use the DateTime objects and manipulate them instead, so if you'd rather switch over your code to something potentially more reliable, you could do that also.

Upvotes: 0

A l w a y s S u n n y
A l w a y s S u n n y

Reputation: 38502

If I were you :) I will try with DateTime class to generate months between your $Startdate and $Enddate. See DateTime

<?php
 $start    = new DateTime('2017-01');
 $end      = new DateTime('2018-06');
 $interval = DateInterval::createFromDateString('1 month');
 $period   = new DatePeriod($start, $interval, $end);
 foreach ($period as $dt) {
    echo $dt->format("Y-m") . PHP_EOL;
 }

DEMO: https://3v4l.org/FvmS4

Upvotes: 4

Related Questions