Возвращает массив месяцев между включительно начальной и конечной дат - PullRequest
2 голосов
/ 21 августа 2010

У меня есть две даты - дата начала и дата окончания.Мне нужно вернуть массив месяцев (в формате «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);
}

Ответы [ 3 ]

2 голосов
/ 21 августа 2010

Проблема в том, что $ start day больше, чем end end, поэтому после добавления месяца, чтобы начать его больше, чем end, решение состоит в том, чтобы использовать первый день месяца, как 2010-08-01, поэтому после добавления +1месяц вы получите как минимум равным $ end;)

0 голосов
/ 21 августа 2010

Добавьте

if( date('d',$month) != date('d',$end) )
   $months[] = date('Y-m', $month);

ниже цикла.Это означает, что вы добавляете последний месяц , если он только частично содержится в $end (дни разные: последняя разница меньше месяца).

rbo

0 голосов
/ 21 августа 2010

Это должно делать то, что вам нужно.

$start = strtotime('2010-08-20');
$end = strtotime('2010-10-15');
$month = $start;
$months[] = date('Y-m', $start);
while($month <= $end) {
  $month = strtotime("+1 month", $month);
  $months[] = date('Y-m', $month);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...