我在开发过程中遇到这么这个问题,因为赶进度,没有记下来处理方案,在鸟哥的博客看到原理分析,很到位!平时开发中总是急着处理问题,没有深入分析和记录问题。

1、问题:

今天是2018-07-31 执行代码:date("Y-m-d",strtotime("-1 month"))
输出是2018-06-01?

2、分析:

  1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.
  2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1

2-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

2-2、处理方案

  1. PHP5.3之后的版本处理方式
    ”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
  2. 使用mktime之类的, 把所有的日子忽略掉, 比如都限定为每月1号就可以了, 只不过就不如直接用first day来的更加优雅

参考资料:http://www.laruence.com/2018/...

原文地址:https://segmentfault.com/a/1190000016348587

strtotime的一个使用问题的更多相关文章

  1. PHP中strtotime()的使用

    strtotime是一个非常强大的函数. 传入的参数,详见官网的介绍 本月最后一个周日 echo date('Y-m-d',strtotime('last sunday of this month') ...

  2. php开发常见问题

    ajax 方面:   ajax写法:   //简写版ajax$.get('url.php',{'name':'myname','age':'18'},function(data){},'json'); ...

  3. php基础语句2

    计算一个月有多少天 $count = date("t",strtotime("2014-09-01")); // 一个月有多少天

  4. 使用PHP获取时间今天 明天 昨天 时间戳的详解

    使用php获取时间今天明天昨天时间戳 2013-06-20 11:12 <?php echo "今天:".date("Y-m-d")."< ...

  5. php日期,时间相关知识整理

    unix 时间戳:从1970年1月1日0点开始到当前时间所经过的秒数. 1.将日期转换为UNIX时间戳 mktime():可以自动校正越界的输入 原型 : mktime(hour,minute,sec ...

  6. 转:php 获取时间今天明天昨天时间戳

    <?php echo "今天:".date("Y-m-d")."<br>"; echo "昨天:".d ...

  7. php 获取时间今天明天昨天时间戳

    <?php echo "今天:".date("Y-m-d")."<br>";      echo "昨天:&qu ...

  8. PHP操作MySQL数据库的相关函数

    首先,要分清SQL语句的类型: SQL语句的分类 (1)DDL:Data Define Language,数据定义语言--定义表的列结构 CREATE.DROP.ALTER.TRUNCATE (2)D ...

  9. 前端PHP入门-023-重点日期函数之程序执行时间检测

    我们有的时经常需要做程序的执行时间执行效率判断. 实现的思路如下: <?php //记录开始时间 //记录结整时 // 开始时间 减去(-) 结束时间 得到程序的运行时间 ?> 可是大家不 ...

随机推荐

  1. 这是一个文字游戏?“这个工作你们部门牵头xx”

    近期集团一个部门在联系做一个网上应用平台系统.经过几次的会议沟通,这个原本就是解决取消个人银行卡收款的需求慢慢变成了一个在线销售加收款平台,因为其对销售的业务不熟悉,现有又有应用的软件,他们也感觉到主 ...

  2. sqlserve 数据类型具体解释

    decimal   精确数值型  decimal 数据类型能用来存储从-10的38次幂-1到10的38次幂-1的固定精度和范围的数值型数据.使用这样的数据类型时,必须指定范围和精度. 范围是小数点左右 ...

  3. ZOJ 3829 Known Notation(字符串处理 数学 牡丹江现场赛)

    题目链接:problemId=5383">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5383 Do you ...

  4. python实现高速排序算法(两种不同实现方式)

    # -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix " ...

  5. luogu3111 [USACO14DEC]牛慢跑Cow Jog_Sliver

    题目大意 有N (1 <= N <= 100,000)头奶牛在一个单人的超长跑道上慢跑,每头牛的起点位置都不同.由于是单人跑道,所有他们之间不能相互超越.当一头速度快的奶牛追上另外一头奶牛 ...

  6. h5-9 canvas

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Linux&nbsp;Oracle服务启动&amp;停止脚本与开机自启动

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...

  8. [JavaEE] 了解Java连接池

    转载自51CTO http://developer.51cto.com/art/201006/207768.htm 51CTO曾经为我们简单的介绍过Java连接池.要了解Java连接池我们先要了解数据 ...

  9. 原生mysql读出来数据有乱码

    加入这个后mysql_query("set names utf8");,可以将读出来的数据变成utf8的格式,可能是解决问题的一个好方法.

  10. POJ 2752 KMP中next数组的应用

    题意: 让你从小到大输出给的字符串中既是前缀又是后缀的子串的长度. 思路: 先要了解这个东西: KMP中next数组表示的含义:记录着字符串匹配过程中失配情况下可以向前多跳几个字符,它描述的也是子串的 ...