php使用strtotime技巧示例解惑

吾爱主题 阅读:142520 2022-11-22 15:52:00 评论:0

引言

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

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

?
1 date ( "Y-m-d" , strtotime ( "-1 month" ))

今天是 2018-07-31 执行代码,怎么输出是 2018-07-01?

好的吧,虽然这个问题看起来很迷惑,但从内部逻辑上来说呢,其实是” 对” 的,你先别着急哈,让我慢慢讲:

我们来模拟下 date 内部的对于这种事情的处理逻辑:

先做 - 1 month, 那么当前是 07-31, 减去一以后就是 06-31.
再做日期规范化,因为 6 月没有 31 号,所以就好像 2 点 60 等于 3 点一样,6 月 31 就等于了 7 月 1
是不是逻辑很” 清晰” 呢?我们也可以手动验证第二个步骤,比如:

?
1 2 var_dump( date ( "Y-m-d" , strtotime ( "2017-06-31" ))); //输出2017-07-01

也就是说,只要涉及到大小月的最后一天,都可能会有这个迷惑,我们也可以很轻松的验证类似的其他月份,印证这个结论:

?
1 2 3 4 5 6 7 8 var_dump( date ( "Y-m-d" , strtotime ( "-1 month" , strtotime ( "2017-03-31" )))); //输出2017-03-03 var_dump( date ( "Y-m-d" , strtotime ( "+1 month" , strtotime ( "2017-08-31" )))); //输出2017-10-01 var_dump( date ( "Y-m-d" , strtotime ( "next month" , strtotime ( "2017-01-31" )))); //输出2017-03-03 var_dump( date ( "Y-m-d" , strtotime ( "last month" , strtotime ( "2017-03-31" )))); //输出2017-03-03

那怎么办呢?

从 PHP5.3 开始呢,date 新增了一系列修正短语,来明确这个问题,那就是”first day of” 和 “last day of”, 也就是你可以限定好不要让 date 自动” 规范化”:

?
1 2 3 4 5 6 7 8 var_dump( date ( "Y-m-d" , strtotime ( "last day of -1 month" , strtotime ( "2017-03-31" )))); //输出2017-02-28 var_dump( date ( "Y-m-d" , strtotime ( "first day of +1 month" , strtotime ( "2017-08-31" )))); 输出2017-09-01 var_dump( date ( "Y-m-d" , strtotime ( "first day of next month" , strtotime ( "2017-01-31" )))); 输出2017-02-01 var_dump( date ( "Y-m-d" , strtotime ( "last day of last month" , strtotime ( "2017-03-31" )))); 输出2017-02-28

那如果是 5.3 之前的版本 (还有人用么?), 你可以使用 mktime 之类的,把所有的日子忽略掉,比如都限定为每月 1 号就可以了,只不过就不如直接用 first day 来的更加优雅.

以上就是php使用strtotime技巧示例解惑的详细内容,更多关于php strtotime解惑的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7130910230493921294

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容