有个项目需要获取上个月的“年-月”,用了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天。

Rasmus Lerdorf,难道你不知道“一三五七八十腊,三十一天永不差”吗?

最后总结,正确地获取上个月“年-月”的姿势为:

date('Y-m', strtotime('-1 month', strtotime(date('Y-m'))))

也就是用每月1日为基准去扣天数。

添加新评论