需求
输入 开始日期和结束日期,返回两个日期之间 月份的列表,包含开始和结束的月份。
实现
可能代码会这么写
function showMonthRange($start, $end)
{
$end = date('Ym', strtotime($end)); // 转换为月
$range = [];
$i = 0;
do {
$month = date('Ym', strtotime($start . ' + ' . $i . ' month'));
//echo $i . ':' . $month . '<br>';
$range[] = $month;
$i++;
} while ($month < $end);
return $range;
}
问题
当输入 【2020-03-31】 和 【2020-04-01】 时 返回了 【202003,202005】,期望返回的是【202003,202004】
出现这个问题的原因时:strtotime 的 +1 month,会直接在month字段上加1,然后再转成日期,4月没有31日,就会变成 5月1日
解决
从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是"first day of" 和 “last day of”, 也就是你可以限定好不要让date自动"规范化":
var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2017-03-31"