返回开始和结束日期之间的月份数组

时间:2010-08-20 21:41:44

标签: php datetime

我有两个日期 - 开始日期和结束日期。我需要返回几个月的数组('Y-m'格式),其中包括开始日期和结束日期之间的每个月,以及这些日期所在的月份。我尝试过:

$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,所以它必须在这些范围内工作。


我使用的解决方案基于以下答案。将$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 个答案:

答案 0 :(得分:2)

问题是$开始日大于结束日,所以在你添加月份以开始大于结束之后,解决方案是使用该月的第一天,如2010-08-01所以在你添加+1之后一个月你将获得至少等于$ end;)

答案 1 :(得分:0)

这应该做你需要的。

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

答案 2 :(得分:0)

添加

if( date('d',$month) != date('d',$end) )
   $months[] = date('Y-m', $month);
循环下面的

。这意味着,如果它仅部分包含在$end中,则会添加最后一个(天数不同:最后差异小于一个月)。

RBO