我有两个日期 - 开始日期和结束日期。我需要返回几个月的数组('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);
}
答案 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