php strtotime,mktime,DateTime函数处理时间累加问题
时间戳(年月日时分秒) 使用strtotime函数,结合+1 month,-1 month,next month,last month的时候会出现一些问题.
demo示例:
//时间"2018-10-16 12:00:00"增加一个月
$timeOne = strtotime("2018-10-16 12:00:00");
echo date("Y-m-d H:i:s", strtotime("+ 1 month", $timeOne ));//2018-10-16 12:00:00[正确] //时间"2018-10-31 10:00:00"增加一个月
$timeTwo = strtotime("2018-10-31 12:00:00");
echo date("Y-m-d H:i:s", strtotime("+ 1 month", $timeTwo ));//2018-12-01 12:00:00[错误]
"date"内部逻辑的处理,其实是正确. 解析内部处理的逻辑?
(1): 先做+1 month,假设当前时间为10-31, 增加一个月时间为11-31
(2): 再做日期规范化,因为11月没有31日,所以就好像3点60等于4点一样;11月31日就等于12月1日
解决方法一: PHP>=5.3 date新增修正短语,用来明确这个问题,那就是"first day of" 和 "last day of",可以限定不要让date自动"规范化"
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')))
//设定时间"2018-10-31 12:00:00"
echo date("Y-m-d H:i:s", mktime(date('12'),0, 0, date('10'), date('31'), date('2018'))); //指定增加30天,时间"2018-11-30 12:00:00"
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
<?php
//设定初始时间: 'Y-m-d H:i:s'
$dateTime = new DateTime("2018-10-31 12:00:00"); $addMonth = 1; //设定间隔的月份 //初始时间的天数值
$initDay = $dateTime->format("d"); //DateInterval构造函数的参数是一个表示时间间隔约定的字符串,这个时间间隔约定以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数.
//有效周期标识符如下: Y(年) M(月) D(日) W(周) H(时) M(分) S(秒) 间隔约定中既可以有时间也可以有日期,如果有时间需要在日期和时间之间加上字母"T"用来分隔.
//例如: 间隔约定P2D表示间隔两天; 间隔约定P2DT5H2M表示间隔两天五小时两分钟 $dateTime->add(new DateInterval("P" . $addMonth . "M"));//增加 一个月时间; 2018-12-01 12:00:00[错误] $newDay = $dateTime->format("d");//累加后新的日期的天数值 //判断间隔月份,天数值是否相同
if($initDay != $newDay) {
//不同减去差值
$dateTime->sub(new DateInterval("P" . $newDay . "D"));//减去 新初时间,天数差的值
} echo $initDay;//31(天)
echo "<br>";
echo $newDay;//1(天)
echo "<br>";
echo $dateTime->format("Y-m-d H:i:s");//2018-11-30 12:00:00[正确]
php strtotime,mktime,DateTime函数处理时间累加问题的更多相关文章
- 8位单片机可用的 mktime localtime函数
8位单片机可用的 mktime localtime函数及源码 最近在做一个8位单片机项目,其中用到了时间戳转换函数,这个在32位机上一个库函数就解决了问题,没想到在8位单片机中没有对应库(time. ...
- datetime模块处理时间
python常用的处理时间的库有:datetime,time,calendar.datetime库包括了date(储存日期:(年.月.日),time(储存时间:(小时.分.秒和微秒),timedelt ...
- python的datetime模块处理时间
python的datetime模块主要用来处理时间,里面包含很多类,包括timedelay,date,time,datetime等 开发中经常会用到模块里面的datetime类,这是一个表示日期时间的 ...
- datetime函数和random.seed()函数的应用
一,datetime 在python中datetime是一个库是一个模块也是一个函数,作用很多,这里面只对其做简单的最常用的讲解. 首先返回系统时间 import datetime nowTime=d ...
- DateTime函数
一.初始化: DateTime dt = , , ); DateTime dt1 = DateTime.Now; DateTime dt2 = DateTime.Today; DateTime dt3 ...
- 用strtotime()和date()函数算出2019年9月的周日日期
strtotime---用于接收两个参数,第一个参数是格式化的日期数据如:date('Y-m-d'),第二个参数有如'+7 day' 函数版 <?php $firstsunday = strto ...
- php strtotime 同样的函数为何在不同的地方输出的结果不同?
方法1:调用函数 date_default_timezone_set('Asia/Shanghai'); // 如果是中国的话 方法2:设置php.ini 中data.timezone [Date] ...
- python 获取年月日时分秒 获取当前时间 datetime函数
import datetime#取当前时间print(datetime.datetime.now())#取年print(datetime.datetime.now().year)#取月print(da ...
- js DateTime函数
---恢复内容开始--- 一.js获取当前日期时间var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFull ...
随机推荐
- lombok 简化 get set toString hash equals等方法
1.lombok 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. 2.安装 下载 https://projectlombok.or ...
- Tunnel Warfare HDU 1540 区间合并+最大最小值
Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...
- ARM汇编2
一. 数据处理汇编指令 1.1. 数据传输指令 1.1.1. mov(Move) 指令 示例:mov r0, r0, LSL#3 ; r0 = r0* 8 mov pc, r ...
- java视频资源
1.Java基础阶段 尚学堂_刘凯立_JavaSE基础视频 http://pan.baidu.com/s/1geCoY11 尚学堂_高淇_Java300集视频教程 https://pan.baidu. ...
- CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android. Buffer Overflow Vulnerability reported by #plzdonthackme, Soctt.
CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android.Buffer Overflow Vu ...
- JavaScript基础1——在末尾添加节点
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- R语言——ifelse函数
在数据处理中,经常会遇到要对判断结果做处理的情况.if函数是经常遇到的. ifelse(cond,statment1,statment2) 如果cond成立,执行statment1,否则执行statm ...
- pg_config - 检索已安装版本的 PostgreSQL 的信息
SYNOPSIS pg_config {--bindir | --includedir | --includedir-server | --libdir | --pkglibdir | --confi ...
- Linux中的sshd服务
Linux中的sshd服务,主要用于pst终端,远程连接到linux服务中 看sshd服务状态 service sshd status 停止sshd服务 service sshd stop 启动ssh ...
- 【串线篇】spring boot日志框架
一.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息:日志框架 ...