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 ...
随机推荐
- 微信小程序 scroll-View 动态定位之scroll-into-view
- 20190901 On Java8 第十五章 异常
第十五章 异常 要想创建健壮的系统,它的每一个构件都必须是健壮的. 异常概念 C++的异常处理机制基于 Ada,Java 中的异常处理则建立在 C++的基础之上(尽管看上去更像 Object Pasc ...
- Java相关面试题总结+答案(五)
[异常] 74. throw 和 throws 的区别? throw 是真实抛出一个异常: throws 是声明可能会抛出一个异常. 75. final.finally.finalize 有什么区别? ...
- 【转载】如何编写ROS的第一个程序hello_world
目录 1.工作空间的创建 2.功能包的创建 3.功能包的源代码编写 4.功能包的编译配置 5.功能包的编译 6.功能包的启动运行 既然ROS已经成功安装好了,大家一定很想亲自动动手编一个通过起手式例程 ...
- Java-集合第六篇操作集合的工具类Collections
1.Java提供了一个操作Set.List.Map等集合的工具类:Collections. 工具类中提供的方法主要针对Set.List.Map的排序.查询.修改等操作,以及将集合对象设置为不可变.对集 ...
- Java-Lambda表达式第二篇认识Lambda表达式
接上面的方法引用和构造器引用: 3>引用某类对象的实例方法 @FunctionalInterface public interface Cut{ String cut(String str,in ...
- 小白学Python(18)——pyecharts 关系图 Graph
Graph-基本示例 import json import os from pyecharts import options as opts from pyecharts.charts import ...
- 回溯---N皇后
N 皇后 51. N-Queens (Hard) 题目描述: 在n*n的矩阵中摆放n个皇后,并且每个皇后不能在同一列,同一个对角线上,求所有的n皇后解. 思路分析: 一行一行地摆放,在确定一行 ...
- JFreeChart与struts2整合实例
1. 3个jar包 jcommon,jfreechart,strust2-jfreechart-plugin 2 <?xml version="1.0" encoding=& ...
- 2018-8-10-win10-uwp-读写XML
title author date CreateTime categories win10 uwp 读写XML lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...