项目中需要循环获取前几个月,但是前几天还好好的,今天突然发现错误,直接上代码(当前日期:2020-12-31)
public function testB()
{
for ($i=5; $i>=0; $i--) {
$month = date('Ym', strtotime(" - $i month"));
echo $month . PHP_EOL;
}
}
//输出(当前日期2020-12-31)
//202007
//202008
//202010
//202010
//202012
//202012
为什么呢今天不行了呢?打印 $i 也是正常的,查阅资料之后发现当获取上个月的日期时 直接使用 date('Ym', strtotime("-1 month") 是有坑的:
当上一个月或者下一个月没有今天的日时,会输出错误,比如今天是12月31号,但是11月份没有31号,此时date('Y-m-d',strtotime("-1 month")); 输出的结果就是 2020-12-01
同理,当在3月31号/5月31号/7月31号/10月31号/12月31号执行date('Y-m-d',strtotime("-1 month"))时,得到的结果是 3月1号/5月1号//7月1号/10月1号/12月1号。
如何正确的获取上一个月份?
因为每月都有1号,如果需要获取上一个月的月份,可以使用以下的方式获取:
date('Ym', strtotime(date('Y-m-01') . " - 1 month"));
public function testB()
{
for ($i=5; $i>=0; $i--) {
$month = date('Ym', strtotime(date('Y-m-01') . " - $i month"));
echo $month . PHP_EOL;
}
}
//输出(当前日期2020-12-31)
//202007
//202008
//202009
//202010
//202011
//202012
同样如果获取上个月的第一天 date('Y-m-01', strtotime(date('Y-m-01') . " - 1 month")); 而不能简单使用 date('Y-m-01', strtotime("-1 month"));
请各位小伙伴避免采坑~