Я пытаюсь перечислить все месяцы между двумя датами.
Например; дата начала: 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; } }
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("Ym") . "<br>\n"; }
Смотрите это в действии
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("Ym") . "<br>\n"; }
Важна роль, в которой мы меняем даты начала и окончания первого месяца. Если бы мы этого не сделали, а в текущий день выше, чем в последний день февраля (т. Е. 28 в непиковые годы, 29 в високосные годы), это пропустит февраль.
Вы должны сделать разницу между двумя месяцами того же года и двух месяцев разных лет.
$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.' }
в$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.' }
в$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.' }
Это сложно. Теперь есть быстрый и простой способ, который уже дается в качестве ответа, который я рекомендую вам выбрать.
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; }
Это было мое решение, поскольку 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