时间戳(年月日时分秒)  使用strtotime函数,结合+1 month,-1 month,next month,last month的时候会出现一些问题.

demo示例:

  1. //时间"2018-10-16 12:00:00"增加一个月
  2. $timeOne = strtotime("2018-10-16 12:00:00");
  3. echo date("Y-m-d H:i:s", strtotime("+ 1 month", $timeOne ));//2018-10-16 12:00:00[正确]
  4.  
  5. //时间"2018-10-31 10:00:00"增加一个月
  6. $timeTwo = strtotime("2018-10-31 12:00:00");
  7. echo date("Y-m-d H:i:s", strtotime("+ 1 month", $timeTwo ));//2018-12-01 12:00:00[错误]

"date"内部逻辑的处理,其实是正确. 解析内部处理的逻辑?

  1. (1): 先做+1 month,假设当前时间为10-31, 增加一个月时间为11-31
  2. (2): 再做日期规范化,因为11月没有31日,所以就好像360等于4点一样;1131日就等于121

解决方法一: PHP>=5.3  date新增修正短语,用来明确这个问题,那就是"first day of" 和 "last day of",可以限定不要让date自动"规范化"

  1. echo date("Y-m-d H:i:s", strtotime("last day of +1 month", strtotime("2018-10-31 12:00:00")));//2018-11-30 12:00:00[正确]

解决方法二: mktime  获取当前时间: date("Y-m-d H:i:s", mktime(date('H'),date('i') ,date('s'), date('m'), date('d'), date('Y')))

  1. //设定时间"2018-10-31 12:00:00"
  2. echo date("Y-m-d H:i:s", mktime(date('12'),0, 0, date('10'), date('31'), date('2018')));
  3.  
  4. //指定增加30天,时间"2018-11-30 12:00:00"
  5. echo date("Y-m-d H:i:s", mktime(date('12'),0, 0, date('10'), date('31')+30, date('2018')));//2018-11-30 12:00:00[正确]

解决方法三: (PHP 5 >= 5.2.0, PHP 7)  DateTime

  1. <?php
  2. //设定初始时间: 'Y-m-d H:i:s'
  3. $dateTime = new DateTime("2018-10-31 12:00:00");
  4.  
  5. $addMonth = 1; //设定间隔的月份
  6.  
  7. //初始时间的天数值
  8. $initDay = $dateTime->format("d");
  9.  
  10. //DateInterval构造函数的参数是一个表示时间间隔约定的字符串,这个时间间隔约定以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数.
  11. //有效周期标识符如下: Y(年) M(月) D(日) W(周) H(时) M(分) S(秒) 间隔约定中既可以有时间也可以有日期,如果有时间需要在日期和时间之间加上字母"T"用来分隔.
  12. //例如: 间隔约定P2D表示间隔两天; 间隔约定P2DT5H2M表示间隔两天五小时两分钟
  13.  
  14. $dateTime->add(new DateInterval("P" . $addMonth . "M"));//增加 一个月时间; 2018-12-01 12:00:00[错误]
  15.  
  16. $newDay = $dateTime->format("d");//累加后新的日期的天数值
  17.  
  18. //判断间隔月份,天数值是否相同
  19. if($initDay != $newDay) {
  20. //不同减去差值
  21. $dateTime->sub(new DateInterval("P" . $newDay . "D"));//减去 新初时间,天数差的值
  22. }
  23.  
  24. echo $initDay;//31(天)
  25. echo "<br>";
  26. echo $newDay;//1(天)
  27. echo "<br>";
  28. echo $dateTime->format("Y-m-d H:i:s");//2018-11-30 12:00:00[正确]

php strtotime,mktime,DateTime函数处理时间累加问题的更多相关文章

  1. 8位单片机可用的 mktime localtime函数

    8位单片机可用的 mktime  localtime函数及源码 最近在做一个8位单片机项目,其中用到了时间戳转换函数,这个在32位机上一个库函数就解决了问题,没想到在8位单片机中没有对应库(time. ...

  2. datetime模块处理时间

    python常用的处理时间的库有:datetime,time,calendar.datetime库包括了date(储存日期:(年.月.日),time(储存时间:(小时.分.秒和微秒),timedelt ...

  3. python的datetime模块处理时间

    python的datetime模块主要用来处理时间,里面包含很多类,包括timedelay,date,time,datetime等 开发中经常会用到模块里面的datetime类,这是一个表示日期时间的 ...

  4. datetime函数和random.seed()函数的应用

    一,datetime 在python中datetime是一个库是一个模块也是一个函数,作用很多,这里面只对其做简单的最常用的讲解. 首先返回系统时间 import datetime nowTime=d ...

  5. DateTime函数

    一.初始化: DateTime dt = , , ); DateTime dt1 = DateTime.Now; DateTime dt2 = DateTime.Today; DateTime dt3 ...

  6. 用strtotime()和date()函数算出2019年9月的周日日期

    strtotime---用于接收两个参数,第一个参数是格式化的日期数据如:date('Y-m-d'),第二个参数有如'+7 day' 函数版 <?php $firstsunday = strto ...

  7. php strtotime 同样的函数为何在不同的地方输出的结果不同?

    方法1:调用函数 date_default_timezone_set('Asia/Shanghai'); // 如果是中国的话 方法2:设置php.ini 中data.timezone [Date] ...

  8. python 获取年月日时分秒 获取当前时间 datetime函数

    import datetime#取当前时间print(datetime.datetime.now())#取年print(datetime.datetime.now().year)#取月print(da ...

  9. js DateTime函数

    ---恢复内容开始--- 一.js获取当前日期时间var myDate = new Date();myDate.getYear();        //获取当前年份(2位)myDate.getFull ...

随机推荐

  1. 山西汽车销量(hive)

    1.创建数据库create database db_cart; 2.使用数据库use db_cart; 3.创建表create table t_cart(province STRING,month I ...

  2. 修改属性item1(1变化)

    给imgList1,7,12,16添加数据 数据层data:{imgList1:[],imgList7:[],imgList12:[],imgList16:[],} 处理层let _this=this ...

  3. 安全运维 - Windows系统维护

    Windows系统加固 账户管理和啊认证授权 日志配置操作 IP协议安全配置:启用SYN攻击保护 文件权限 服务安全 安全选项:启动安全选项.禁用未登录前关机 其他安全配置: 防病毒管理.设置屏幕保护 ...

  4. 【转载】研发应该懂的binlog知识(上)

    ---------------------------------------------------------------------------------------------------- ...

  5. HDU 6070题解(二分+线段树)

    题面 传送门 此题的题意不是很清晰,要注意的一点是在区间[L,R]中,默认题目编号最后一次出现的时候是AC的 比如1 2 1 2 3 ,在区间[1,4]中,第3次提交时AC第1题,第4次提交时AC第2 ...

  6. k8s结合helm部署

    一.安装Helm helm教程以及安装可以参考这篇文章 二.Heml说明 常见的helm模板如下 myapp - chart 包目录名 ├── charts - 依赖的子包目录,里面可以包含多个依赖的 ...

  7. linux学习笔记(1):

    一.Linux系统简介 1.什么是linux Linux是一个免费的.多用户.多任务的操作系统,其运行方式.功能和UNIX系统很相似,但Linux系统的稳定性.安全性与网络功能是许多商业操作系统所无法 ...

  8. vue中对于图片是否正常加载的思考

    问题:由于业务需要,我们需要判断图片能否正常的加载,如果未正常加载的话,需要显示一张默认图片: 方案:1,由于后台返回的是一个图片id数组,例如 imgList=['343313131','21333 ...

  9. 361-基于6U VPX TMS320C6678+XC7K325T 的信号处理板

    基于6U VPX TMS320C6678+XC7K325T 的信号处理板 一.板卡概述 本板卡基于6U VPX结构设计无线电信号处理平台.板卡包含1片C6678芯片,1片 FPGA XC7K325T- ...

  10. xftp xshell 个人下载官网

    https://www.netsarang.com/zh/xftp-download/