php 日期相减获得天数,PHP两个日期相减 计算天数、月、年[Stack Overflow]
本文主要解决PHP如何判断两个日期之间相距的天数,并可换算为月、年。
在PHP5.3以上版本,可以使用strtotime()后的数值直接相减,然后换算为年月日。举例:
$date1 = "2007-03-24";
$date2 = "2009-06-26";
$diff = abs(strtotime($date2) - strtotime($date1));
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
printf("%d years, %d months, %d days\n", $years, $months, $days);
解决方案作者:Emil H
PHP5.3以下版本,可以尝试以下代码。但是作者特别说明,这种算法算出的可能是一个近似值,而不是精确值。不过作为常规应用应该是没有问题的。
/**
* Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff()
* implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved.
*
* See here for original code:
* http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup
* http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup
*/
function _date_range_limit($start, $end, $adj, $a, $b, $result)
{
if ($result[$a] < $start) {
$result[$b] -= intval(($start - $result[$a] - 1) / $adj) + 1;
$result[$a] += $adj * intval(($start - $result[$a] - 1) / $adj + 1);
}
if ($result[$a] >= $end) {
$result[$b] += intval($result[$a] / $adj);
$result[$a] -= $adj * intval($result[$a] / $adj);
}
return $result;
}
function _date_range_limit_days($base, $result)
{
$days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
_date_range_limit(1, 13, 12, "m", "y", &$base);
$year = $base["y"];
$month = $base["m"];
if (!$result["invert"]) {
while ($result["d"] < 0) {
$month--;
if ($month < 1) {
$month += 12;
$year--;
}
$leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
$days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];
$result["d"] += $days;
$result["m"]--;
}
} else {
while ($result["d"] < 0) {
$leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
$days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];
$result["d"] += $days;
$result["m"]--;
$month++;
if ($month > 12) {
$month -= 12;
$year++;
}
}
}
return $result;
}
function _date_normalize($base, $result)
{
$result = _date_range_limit(0, 60, 60, "s", "i", $result);
$result = _date_range_limit(0, 60, 60, "i", "h", $result);
$result = _date_range_limit(0, 24, 24, "h", "d", $result);
$result = _date_range_limit(0, 12, 12, "m", "y", $result);
$result = _date_range_limit_days(&$base, &$result);
$result = _date_range_limit(0, 12, 12, "m", "y", $result);
return $result;
}
/**
* Accepts two unix timestamps.
*/
function _date_diff($one, $two)
{
$invert = false;
if ($one > $two) {
list($one, $two) = array($two, $one);
$invert = true;
}
$key = array("y", "m", "d", "h", "i", "s");
$a = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $one))));
$b = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $two))));
$result = array();
$result["y"] = $b["y"] - $a["y"];
$result["m"] = $b["m"] - $a["m"];
$result["d"] = $b["d"] - $a["d"];
$result["h"] = $b["h"] - $a["h"];
$result["i"] = $b["i"] - $a["i"];
$result["s"] = $b["s"] - $a["s"];
$result["invert"] = $invert ? 1 : 0;
$result["days"] = intval(abs(($one - $two)/86400));
if ($invert) {
_date_normalize(&$a, &$result);
} else {
_date_normalize(&$b, &$result);
}
return $result;
}
$date = "1986-11-10 19:37:22";
print_r(_date_diff(strtotime($date), time()));
print_r(_date_diff(time(), strtotime($date)));
php 日期相减获得天数,PHP两个日期相减 计算天数、月、年[Stack Overflow]相关推荐
- pandas使用date_range函数生成日期序列数据、pandas将两个日期序列数据作差生成新的日期差数据列(8 days)、并提取天数数值(8)
pandas使用date_range函数生成日期序列数据.pandas将两个日期序列数据作差生成新的日期差数据列(8 days).并提取天数数值(8) 目录
- (C++)设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,包括某日期加上指定天数、某日期减去指定天数、两个日期相差的天数等。
C++面向对象程序设计课后作业第239页第5题 题目要求:设计一个日期类Date,包括年.月.日等私有数据成员.要求实现日期的基本运算,包括某日期加上指定天数.某日期减去指定天数.两个日期相差的天数等 ...
- mysql日期相减返回秒_mysql两个日期相减得到秒、分、天
一.MySQL中两个DateTime字段相减 假定表名为tblName,两个DateTime字段名分别为beginDateTime,endDateTime,以下是相关两个mysql日期字段相减的SQL ...
- java calendar 日期差_java利用Calendar如何计算两个日期只差?
展开全部 Java创建一个日历对象,需要引入java.util.*包,用当前时间初始化日历时间,计算62616964757a686964616fe4b893e5b19e31333337616634两个 ...
- 利用joda(强大的Java日期操作组件)实现获取两个日期间隔
public static void main(String[] args) {System.out.println(getDateTimeBetween(start.toDate(),end.toD ...
- java 两日期的周数_java – 获取两个日期之间的周数.
我在一个项目中工作,我在Date中有两种类型.我想计算这两个日期之间的星期数.日期可能在不同的年份.有没有什么好的解决方案呢? 我试图用Joda-time来实现这一点,这在其他主题中被提出. 我不喜欢 ...
- mysql query日期_如何获取mysql中两个日期之间的日期列表select query
尝试: select * from (select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) s ...
- Mysql日期差函数,Mysql选择两个日期字段相差大于或小于一定时间
SELECT * from table where TIMESTAMPDIFF(type,pretime,latertime)>100 TIMESTAMPDIFF函数,需要三个参数,typ ...
- 比较两个日期oracle,在oracledb中比较两个日期并不能得到正确的结果
我有两个 DATE Order_date Service_date 01-06-17 31-01-18 01-06-17 01-10-18 01-06-17 01-07-18 01-06-17 01- ...
最新文章
- 一个北漂女孩-不想嫁给有钱人
- 第八周项目一-数组做数据成员(3)
- 让Hinton后悔投少了的AI公司:吴恩达弟子徒孙创办,LeCun李飞飞Jeff Dean投资,产品让人无法拒绝...
- c++ 中pair类模板的用法详解
- javaone_JavaOne 2012覆盖率
- oracle实例的概念组成,oracle体系结构的两个基本概念:数据库和实例
- linux如何进入opt目录,Linux 程序安装目录 /opt 目录和 /usr/local 目录
- [转载] Python进程——multiprocessing.Event()|Barrier()
- 2020小美赛【A题翻译+思路】
- 3D打印软件——Repetier-Host 简单的使用总结
- JAVA中利用Docx4J组件操作word文档,进行docx格式文档的创建、写入、读取、转换html、图片处理示例、转换pdf
- 傻瓜式安装卸载office
- DS18B20数字温度计 (二) 测温, ROM和CRC算法
- 波粒二象性及波尔电子轨道理论
- 三种嵌入式操作系统比较和分析
- irq_desc操作
- UOS系统下安装软件打不开的解决方法
- android 7.0 2g,LG美国定制机曝光:2GB内存,搭载安卓7.0系统
- 微商城模式适合什么规模企业?新商云,满足多种行业需求!
- ABAP开发 ~消息处理 (Messages)
热门文章
- php字符串处理函数大全--有时候我们只需要知道名字。
- 200左右哪款蓝牙耳机值得入手?双11小白新手避雷高性能蓝牙耳机
- 【Midjourney教程】设计麻瓜也能10分钟上架一套表情包
- 修改 vscode 中主题注释中文的斜体格式
- Spring集成JPA提示Not an managed type
- 小米笔记本 air 12.5寸 支持硬盘参数
- Java bean中字段命名潜规则,前两个字母要么都大写,要么都小写
- [M1]Daily Scum 9.27
- 高性价比掌机Retroid Pocket 3:搭载展锐芯片T310,采用PowerVR GPU
- Android借助bmob实现简单的登陆注册