2013-09-11 2 views
40

Я пытаюсь перечислить все месяцы между двумя датами.Как перечислить все месяцы между двумя датами

Например, дата начала: 2010-12-02 и последняя дата: 2012-05-06

Я хочу перечислить что-то вроде этого:

2010-12 
2011-01 
2011-02 
2011-03 
2011-04 
. 
. 
. 
2012-04 
2012-05 

Это то, что я пытался и не работает вообще:

$year_min = 2010; 
    $year_max = 2012; 
    $month_min = 12; 
    $month_max = 5; 
    for($y=$year_min; $y<=$year_max; $y++) 
    { 
     for($m=$month_min; $m<=$month_max; $m++) 
     { 
      $period[] = $y.$m; 
     } 
    } 

ответ

133

PHP 5,3

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

See it in action

PHP 5.4 или более поздняя версия

$start = (new DateTime('2010-12-02'))->modify('first day of this month'); 
$end  = (new DateTime('2012-05-06'))->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"; 
} 

часть, где мы изменить начальные и конечные даты до первого числа месяца, имеет важное значение. Если бы мы этого не сделали, а в текущий день выше, чем в последний день февраля (т. Е. В 28 лет без високосного года, 29 в високосные годы), это пропустит февраль.

+0

Избили меня к нему. +1! –

+15

IMO 'this.is (« awesome! »)'. – vikingmaster

+0

Это исправляет и стоит upvote, чтобы увидеть, как кто-то использует объекты datetime и dateintervals для простого решения ... хотя я не ожидал бы чего-то меньшего от кого-то с вашим rep :) –

7

Вы должны внести разницу между двумя месяцами того же года и двух месяцев разных лет.

$year_min = substr($row['contractStart'], 0, 4); 
$year_max = substr($row['contractEnd'], 0, 4); 
$month_min = substr($row['contractStart'], 5, 2); 
$month_min = substr($row['contractEnd'], 5, 2); 
$period = array(); 
try { 
    if ($year_min > $year_max) 
    throw new Exception(); 
    else if ($year_min == $year_max) 
    if ($month_min > $month_max) 
     throw new Exception(); 
    for ($month = $month_min; $month <= $month_max; $month++) { 
     $period[] = $month . '-' . $year; 
    } 
    else { 
    for ($month = $month_min; $month <= 12; $month++) { 
     $period[] = $month . '-' . $year_min; 
    } 
    for ($year = $year_min + 1; $year < $year_max; $year++) { 
     for ($month = $month_min; $month <= $month_max; $month++) { 
     $period[] = $month . '-' . $year; 
     } 
    } 
    for ($month = 1; $month <= $month_max; $month++) { 
     $period[] = $month . '-' . $year_max; 
    } 
    } 
    implode("<br />\r\n", $period); 
} 
catch (Exception $e) { 
    echo 'Start date occures after end date.' 
} 

Это для трудного пути. Теперь есть быстрый и простой способ, который уже дается в качестве ответа, который я рекомендую вам выбрать.

+2

Я должен был поддержать вас за то, что вы нашли время, чтобы сформулировать решение, используя код, который они предоставлено –

+1

Большое спасибо, мне было весело это делать. К счастью, вы не выбрали мой ответ в своем коде: -P! – SteeveDroz

5

Это было мое решение, поскольку DateTime недоступно в моей серверной среде.

$a = "2007-01-01"; 
$b = "2008-02-15"; 

$i = date("Ym", strtotime($a)); 
while($i <= date("Ym", strtotime($b))){ 
    echo $i."\n"; 
    if(substr($i, 4, 2) == "12") 
     $i = (date("Y", strtotime($i."01")) + 1)."01"; 
    else 
     $i++; 
} 

Попробуйте: http://3v4l.org/BZOmb

7
function getMonthsInRange($startDate, $endDate) { 
$months = array(); 
while (strtotime($startDate) <= strtotime($endDate)) { 
    $months[] = array('year' => date('Y', strtotime($startDate)), 'month' => date('m', strtotime($startDate)),); 
    $startDate = date('d M Y', strtotime($startDate. 
     '+ 1 month')); 
} 

return $months; 
} 
+1

Можете ли вы пояснить, почему это полезно, пожалуйста? – durron597

Смежные вопросы