PHP关于strtotime('-1 month')的bug
有个项目需要获取上个月的“年-月”,用了php的这个方法:
date( 'Y-m', strtotime('-1 month') )
今天2020年12月31日,发现上述函数给出的结果是2020-12,仔细研究了一下,原来是php的bug:
echo date('Y-m-d', strtotime('-1 month', strtotime('2019-03-31')));
// 输出2019-03-03,非闰年,扣28天
echo date('Y-m-d', strtotime('-1 month', strtotime('2020-03-31')));
// 输出2019-03-02,闰年,扣29天
echo date('Y-m-d', strtotime('-1 month', strtotime('2020-06-30')));
// 输出2020-05-30,扣30天,这个正常
echo date('Y-m-d', strtotime('-1 month', strtotime('2020-05-31')));
// 输出2020-05-01,遇到有31天的月份依然扣30天
这个bug总结起来就是:
- 在3月份,如果当年是闰年,则执行'-1 month'一股脑减29天,非闰年一股脑减28天。
- 在非3月份,全部一股脑减30天。
结合“一三五七八十腊,三十一天永不差”,最后总结,正确地获取上个月“年-月”的姿势为:
date('Y-m', strtotime('-1 month', strtotime(date('Y-m'))))
也就是用每月1日为基准去扣天数。