令人困惑的strtotime
经常会有人被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-31.
- 2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1
是不是逻辑很”清晰”呢? 我们也可以手动验证第二个步骤, 比如:
- var_dump(date("Y-m-d", strtotime("2017-06-31")));
- //输出2017-07-01
也就是说, 只要涉及到大小月的最后一天, 都可能会有这个迷惑, 我们也可以很轻松的验证类似的其他月份, 印证这个结论:
- 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自动”规范化”:
- 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来的更加优雅.
现在, 搞清楚了内部原理, 是不是就不慌了?
原文出处:http://www.laruence.com/2018/07/31/3207.html
令人困惑的strtotime的更多相关文章
- PHP令人困惑的strtotime
经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌… 比如:今天 ...
- python logging模块可能会令人困惑的地方
python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...
- Java安全编码:糟糕的在线建议和令人困惑的APIs
对于程序员和软件开发人员来说,网络论坛提供了一个交流知识和寻找具体编码难题答案的好地方.遗憾的是,他们并不总是准确信息的来源. 弗吉尼亚理工大学的一组研究人员分析了数百篇关于Stack Overflo ...
- 一个令人困惑的低效SQL
整理之前的优化案例,觉得下面这个应该是开发很难发现也会很困惑的一个低效SQL. 看下面这个SQL.你看到这个SQL会不会感觉很正常.其实我刚看到也觉得正常得不得了.但是测试后它确实效率很低.selec ...
- PHP最佳实践(译)
原文: PHP Best Practices-A short, practical guide for common and confusing PHP tasks 译者:youngsterxyf 最 ...
- ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus
ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...
- [转载]Google Guava官方教程(中文版)
原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,武祖 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] ...
- Python标准模块--concurrent.futures
1 模块简介 concurrent.futures模块是在Python3.2中添加的.根据Python的官方文档,concurrent.futures模块提供给开发者一个执行异步调用的高级接口.con ...
- Python标准模块--import
1 模块简介 作为一个Python初学者,你首先要学会的知识就是如何引入其它模块或者包.但是,我发现有些开发者虽然使用Python很多年,依然不了解Python引入机制的灵活性.这篇文章,我们就会研究 ...
随机推荐
- 5G从小就梦想着自己要迎娶:高速率、低时延、大容量三个老婆
摘要:2020年7月9日,ITU正式把NB-IoT纳入5G标准体系! 高速率.低时延与5G是青梅竹马的关系,在大容量的选择上,5G与NB-IoT不断传出着绯闻,终于:2020年7月9日,ITU正式把N ...
- hdfs常用api(java)
1.下载文件到本地 public class HdfsUrlTest { static{ //注册url 让java程序识别hdfs的url URL.setURLStreamHandlerFactor ...
- 哲思集-转载自CSDN
CSDN 创始人蒋涛:世界被编码之后 分享赚¥9.90订阅博主 “写代码 20 年,通过网络平台和社区,帮助中国的程序员更好成长,这是我最希望被大家记住的.”这是蒋涛接受 ZAKER 采访的开场白. ...
- 关于make及makefile的工作笔记
之前一直是用java的,最近工作中需要在Linux中写一个C++程序,之前的写法很不规范,只有一个CPP.记录一下关于makefile的相关知识 想要完整的了解相关内容,推荐看这本书<程序员的自 ...
- JavaScript学习系列博客_15_栈内存、堆内存
栈内存 - JS中的变量都是保存到栈内存中的,- 基本数据类型的值直接在栈内存中存储,- 值与值之间是独立存在,修改一个变量不会影响其他的变量 堆内存 - 对象是保存到堆内存中的,每创建一个新的对象, ...
- lvm常用指令
1.物理卷命令一般维护命令:#pvscan //在系统的所有磁盘中搜索已存在的物理卷#pvdisplay 物理卷全路径名称 //用于显示指定物理卷的属性.#pvdata 物理卷全路径名称 //用于显示 ...
- Vue的Options
el:挂载点 与$mount有替换关系 new Vue({ el: "#app" }); new Vue({}).$mount('#app') 注:被你选为挂载点的那个元素,如果在 ...
- MySQL进阶之MySQL索引以及索引优化
本文配合B站学习视频BV1es411u7we使用效果更佳. 1. MySQL版本 主流版本:5.x版 5.0 - 5.1:早期产品的延续,升级维护 5.4 - 5.x:MySQL整合了三方公司的新存储 ...
- Spring boot程序的部署及运行
将 spring boot 应用程序打包成 jar 包 我们使用 spring boot 的 maven 插件来构建管理整个应用程序,使用 mvn package 将应用程序打包成一个 jar 包 将 ...
- Java面试题(Kafka篇+zookeeper 篇)
Kafka 152.kafka 可以脱离 zookeeper 单独使用吗?为什么? kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafk ...