首页 » SEO优化 » phpstrtotime菜鸟技巧_PHP编程鸟哥令人困惑的strtotime

phpstrtotime菜鸟技巧_PHP编程鸟哥令人困惑的strtotime

访客 2024-12-13 0

扫一扫用手机浏览

文章目录 [+]

常常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会以为这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌…

这不, 刚刚就有人在微博上又问我:

phpstrtotime菜鸟技巧_PHP编程鸟哥令人困惑的strtotime

鸟哥,本日是2018-07-31 实行代码,为什么我实行date(\"大众Y-m-d\公众,strtotime(\"大众-1 month\"大众)),却返回2018-07-01呢?

phpstrtotime菜鸟技巧_PHP编程鸟哥令人困惑的strtotime
(图片来自网络侵删)

好的吧,虽然这个问题看起来很迷惑,但从内部逻辑上来说呢,实在是“对”的,你先别焦急哈, 让我逐步讲。

我们来仿照下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来的更加优雅。

现在,搞清楚了内部事理, 是不是就不慌了?

本文转载自”风雪之隅“,由”编码之道“编辑整理

标签:

相关文章