php中的strtotime的一个奇怪问题
2018-09-17 本文已影响0人
七剑演武堂
strtotime()是php日期函数当中非常灵活的一个函数, 可以实现一些语义化的操作. 比如: +1 day, -1 month, next year 这样的操作.
但是在实际体验当中,发现了一个奇怪的问题(今天是2016-03-31)
var_dump(date('Y-m-d', strtotime('2016-03-31 - 1 month')));
得出的结果是: string '2016-03-02' (length=10)
这不是扯呢么, 我明明让他减得是一个月啊, 我期望的结果是 '2016-02-28', 为什么会出现这样的情况呢?
我们从头开始去分析: 2016-03-31 减去一个月, 得到的结果是 2016-02-31, 但是2016年并没有2月31号, 只有29号
var_dump(date('Y-m-d', strtotime('2016-02-31')));
得到的结果是string '2016-03-02' (length=10)
这么看来strtotime函数并没有做错什么, 那我们怎么样才能得到我们预期的效果呢?
从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是”first day of” 和 “last day of”, 也就是你可以限定好不要让date自动”规范化”:
var_dump(date('Y-m-d', strtotime('last day of 2016-03-31 - 1 month'))); //2016-02-29
var_dump(date('Y-m-d', strtotime('first day of 2016-02-29 + 1 month'))); //2016-03-01
弄明白了这些, 就能更好的使用strtotime函数, 达到我们的预期结果.