本文主要解决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]相关推荐

  1. pandas使用date_range函数生成日期序列数据、pandas将两个日期序列数据作差生成新的日期差数据列(8 days)、并提取天数数值(8)

    pandas使用date_range函数生成日期序列数据.pandas将两个日期序列数据作差生成新的日期差数据列(8 days).并提取天数数值(8) 目录

  2. (C++)设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,包括某日期加上指定天数、某日期减去指定天数、两个日期相差的天数等。

    C++面向对象程序设计课后作业第239页第5题 题目要求:设计一个日期类Date,包括年.月.日等私有数据成员.要求实现日期的基本运算,包括某日期加上指定天数.某日期减去指定天数.两个日期相差的天数等 ...

  3. mysql日期相减返回秒_mysql两个日期相减得到秒、分、天

    一.MySQL中两个DateTime字段相减 假定表名为tblName,两个DateTime字段名分别为beginDateTime,endDateTime,以下是相关两个mysql日期字段相减的SQL ...

  4. java calendar 日期差_java利用Calendar如何计算两个日期只差?

    展开全部 Java创建一个日历对象,需要引入java.util.*包,用当前时间初始化日历时间,计算62616964757a686964616fe4b893e5b19e31333337616634两个 ...

  5. 利用joda(强大的Java日期操作组件)实现获取两个日期间隔

    public static void main(String[] args) {System.out.println(getDateTimeBetween(start.toDate(),end.toD ...

  6. java 两日期的周数_java – 获取两个日期之间的周数.

    我在一个项目中工作,我在Date中有两种类型.我想计算这两个日期之间的星期数.日期可能在不同的年份.有没有什么好的解决方案呢? 我试图用Joda-time来实现这一点,这在其他主题中被提出. 我不喜欢 ...

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

  8. Mysql日期差函数,Mysql选择两个日期字段相差大于或小于一定时间

     SELECT * from table where TIMESTAMPDIFF(type,pretime,latertime)>100 TIMESTAMPDIFF函数,需要三个参数,typ ...

  9. 比较两个日期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- ...

最新文章

  1. 一个北漂女孩-不想嫁给有钱人
  2. 第八周项目一-数组做数据成员(3)
  3. 让Hinton后悔投少了的AI公司:吴恩达弟子徒孙创办,LeCun李飞飞Jeff Dean投资,产品让人无法拒绝...
  4. c++ 中pair类模板的用法详解
  5. javaone_JavaOne 2012覆盖率
  6. oracle实例的概念组成,oracle体系结构的两个基本概念:数据库和实例
  7. linux如何进入opt目录,Linux 程序安装目录 /opt 目录和 /usr/local 目录
  8. [转载] Python进程——multiprocessing.Event()|Barrier()
  9. 2020小美赛【A题翻译+思路】
  10. 3D打印软件——Repetier-Host 简单的使用总结
  11. JAVA中利用Docx4J组件操作word文档,进行docx格式文档的创建、写入、读取、转换html、图片处理示例、转换pdf
  12. 傻瓜式安装卸载office
  13. DS18B20数字温度计 (二) 测温, ROM和CRC算法
  14. 波粒二象性及波尔电子轨道理论
  15. 三种嵌入式操作系统比较和分析
  16. irq_desc操作
  17. UOS系统下安装软件打不开的解决方法
  18. android 7.0 2g,LG美国定制机曝光:2GB内存,搭载安卓7.0系统
  19. 微商城模式适合什么规模企业?新商云,满足多种行业需求!
  20. ABAP开发 ~消息处理 (Messages)

热门文章

  1. php字符串处理函数大全--有时候我们只需要知道名字。
  2. 200左右哪款蓝牙耳机值得入手?双11小白新手避雷高性能蓝牙耳机
  3. 【Midjourney教程】设计麻瓜也能10分钟上架一套表情包
  4. 修改 vscode 中主题注释中文的斜体格式
  5. Spring集成JPA提示Not an managed type
  6. 小米笔记本 air 12.5寸 支持硬盘参数
  7. Java bean中字段命名潜规则,前两个字母要么都大写,要么都小写
  8. [M1]Daily Scum 9.27
  9. 高性价比掌机Retroid Pocket 3:搭载展锐芯片T310,采用PowerVR GPU
  10. Android借助bmob实现简单的登陆注册