常常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会以为这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌…
这不, 刚刚就有人在微博上又问我:
鸟哥,本日是2018-07-31 实行代码,为什么我实行date(\公众Y-m-d\"大众,strtotime(\"大众-1 month\"大众)),却返回2018-07-01呢?

好的吧,虽然这个问题看起来很迷惑,但从内部逻辑上来说呢,实在是“对”的,你先别焦急哈, 让我逐步讲。
我们来仿照下date内部的对付这种事情的处理逻辑:
1. 先做-1 month,那么当前是07-31,减去一往后便是06-312. 再做日期规范化,由于6月没有31号, 以是就彷佛2点60即是3点一样, 6月31就即是7月1了是不是逻辑很”清晰”呢?如果你还不明白, 我们也可以手动验证第二个步骤,比如:
var_dump(date(\"大众Y-m-d\公众, strtotime(\"大众2017-06-31\公众)));
上面这一行代码实行完后,其结果也会返回2017-07-01。也便是说,只要涉及到大小月的末了一天,都可能会有这个迷惑,我们也可以很轻松的验证类似的其他月份, 印证这个结论:
那怎么办呢?
从PHP5.3开始呢, date新增了一系列改动短语,来明确这个问题,那便是“first day of” 和 “last day of”, 也便是你可以限定好不要让date自动”规范化”:
那如果是5.3之前的版本(还有人用么?),你可以利用mktime之类的, 把所有的日子忽略掉, 比如都限定为每月1号就可以了, 只不过就不如直接用first day来的更加优雅。
现在,搞清楚了内部事理, 是不是就不慌了?
本文转载自”风雪之隅“,由”编码之道“编辑整理