У меня есть две даты - дата начала и дата окончания.Мне нужно вернуть массив месяцев (в формате «Ym»), который включает каждый месяц между начальной и конечной датой, а также месяцы, в которых находятся эти даты. Я пробовал:
$start = strtotime('2010-08-20');
$end = strtotime('2010-09-15');
$month = $start;
while($month <= $end) {
$months[] = date('Y-m', $month);
$month = strtotime("+1 month", $month);
}
Проблема в том, что в приведенном выше примере он добавляет в массив только «2010-08», а не «2010-09».Я чувствую, что решение должно быть очевидным, но я просто не вижу его.
Обратите внимание, что это должно учитывать ситуации, такие как:
$start = strtotime('2010-08-20');
$end = strtotime('2010-08-21');
// should return '2010-08'
$start = strtotime('2010-08-20');
$end = strtotime('2010-09-01');
// should return '2010-08,2010-09'
$start = strtotime('2010-08-20');
$end = strtotime('2010-10-21');
// should return '2010-08,2010-09,2010-10'
Кроме того, версия PHP намой хост 5.2.6, поэтому он должен работать в этих пределах.
Решение, которое я использовал, было основано на ответе ниже re.установка $start
на первый день месяца.Однако я не мог заставить его работать только с strtotime()
, и вместо этого мне пришлось использовать другую функцию, которую я нашел в Интернете.
function firstDayOfMonth($uts=null)
{
$today = is_null($uts) ? getDate() : getDate($uts);
$first_day = getdate(mktime(0,0,0,$today['mon'],1,$today['year']));
return $first_day[0];
}
$start = strtotime('2010-08-20');
$end = strtotime('2010-09-15');
$month = firstDayOfMonth($start);
while($month <= $end) {
$months[] = date('Y-m', $month);
$month = strtotime("+1 month", $month);
}