经常会有人被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

转载于:https://www.cnblogs.com/ldj3/p/10569687.html

PHP令人困惑的strtotime相关推荐

  1. php语法难看,PHP语法之令人困惑的strtotime

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

  2. oauth2和jwt_OAuth2,JWT,Open-ID Connect和其他令人困惑的事物

    oauth2和jwt 免责声明 如果觉得我必须从一个重要的免责声明开始这篇文章: 不要太相信我要说的话. 我之所以这样说,是因为我们正在讨论安全性. 而且, 当您谈论安全性时,除了100%正确的陈述外 ...

  3. OAuth2,JWT,Open-ID Connect和其他令人困惑的事物

    免责声明 如果觉得我必须从一个重要的免责声明开始这篇文章: 不要太相信我要说的话. 我之所以这样说,是因为我们正在讨论安全性. 而且, 当您谈论安全性时,除了100%正确的陈述外,还有冒任何其他风险的 ...

  4. 了解令人困惑的物联网平台世界

    物联网的迅速崛起已经席卷全球市场,慢慢地将怀疑论者和批评者转变为坚定的数字化拥护者.然而,随着物联网比以往任何时候都更加流行和强大,市场上充斥着围绕着现有最佳物联网平台的思维漩涡.在大多数时候,这只会 ...

  5. 令代码停止_那些令人困惑的灯泡代码是什么意思?

    令代码停止 There are so many types of light bulbs available on the market that it's hard to keep track of ...

  6. Nintendo帐户,用户ID和网络ID:Nintendo所有令人困惑的帐户,说明

    Nintendo has a dizzying array of different online accounts connected to various services. If you're ...

  7. 图像分类再思考DNN似乎遵循一种令人困惑的简单策略来对图像分类

    https://www.toutiao.com/a6695148561157325319/ 作者:Wieland Brendel 编译:ronghuaiyang 导读 一直以来,对于深度神经网络图像分 ...

  8. 理论计算机科学中最令人困惑的谜题之一被解开

    来源:原理 "自敏感度猜想提出以来,它便是所有组合学和理论计算机科学中最令人沮丧和尴尬的开放性问题之一."德克萨斯大学奥斯汀分校的理论计算机学家Scott Aaronson在一篇博 ...

  9. 令人困惑的fitsSystemWindows

    fitsSystemWindows 介绍 根据官方文档,如果某个View 的fitsSystemWindows 设为true,那么该View的padding属性将由系统设置,用户在布局文件中设置的 p ...

  10. osg机械加工术语_所有那些令人困惑的机械键盘术语,解释了

    osg机械加工术语 Mechanical keyboards are all the rage among gamers and writers. Most people who try them l ...

最新文章

  1. mysql修改数据库名字_mysql 数据库修改名字
  2. 如何快速切换静态和动态ip
  3. java 取pdf 文本域_java – 使用iText从pdf文件中提取文本列
  4. linux如何卸载内核模块_如何加载或卸载Linux内核模块
  5. bat 命令行执行 java(jar)获取返回值 【ERRORLEVEL、System.exit(code)】
  6. 直关的sql 联级更新语句
  7. 路由器与计算机的ip地址,路由器ip地址与mac地址绑定
  8. 素数筛法(python实现)
  9. python读取yml文件
  10. uniapp适配pc_uniapp+Html5端实现PC端适配
  11. 海外手机号码正则匹配
  12. 用js代码实现四位验证码
  13. windows 11变回原来的右键菜单
  14. 贪心算法题目 电池的寿命
  15. 集合中篇—栈与队列区块链
  16. RSA加密解密算法工具_JAVA
  17. 通达oa php_PHP的版本选择 discuz x3.2 php版本 通达oa php版本 最新版
  18. app常见性能测试点
  19. VMware安装win10系统的心路历程
  20. 内网渗透(十一)之内网信息收集-内网IP扫描和发现

热门文章

  1. 计算机病毒实践汇总三:动态分析基础(分析程序)
  2. hdu 1978 How many ways(dp)
  3. UCenter密码算法规则和生成方法
  4. Java 8 新特性(一)lambda表达式
  5. Boolean.getBoolean()和Boolean.parseBoolean()
  6. 几个你可能不了解的CSS单位
  7. SpringBoot❤SpringClould常用注解史诗级汇总
  8. 3.修改和编译XposedBridge.jar 和 api.jar
  9. epoll内核源码详解+自己总结的流程
  10. python findall_Python 正则表达式:findall