分享PHP计算两个日期相差天数的代码


Posted in PHP onDecember 23, 2015

本文实例讲述了php计算两个日期相差天数的方法。分享给大家供大家参考。具体实现方法如下:

<?php
$date1 = date( 'Y-m-d' );
$date2 = "2015-12-04";
$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);
-------------------------------------------------------- OR
$date1 = new DateTime("2007-03-24");
$date2 = new DateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; 
// shows the total amount of days (not divided into years, months and days like above)
echo "difference " . $interval->days . " days ";
-------------------------------------------------------- OR  
  
/**
 * 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.
*/
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 = "2014-12-04 19:37:22";
echo '<pre>';
print_r( _date_diff( strtotime($date), time() ) );
echo '</pre>'; 
?>

希望本文所述对大家学习php程序设计有所帮助。

PHP 相关文章推荐
smarty实例教程
Nov 19 PHP
PHP生成指定长度随机数最简洁的方法
Jul 14 PHP
php中fsockopen用法实例
Jan 05 PHP
php实现window平台的checkdnsrr函数
May 27 PHP
php图片添加文字水印实现代码
Mar 15 PHP
关于Laravel Route重定向的一个注意点
Jan 16 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
thinkPHP5框架接口写法简单示例
Aug 05 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 #PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 #PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 #PHP
详解WordPress中简码格式标签编写的基本方法
Dec 22 #PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 #PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
Dec 22 #PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 #PHP
You might like
PHP+DBM的同学录程序(4)
2006/10/09 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
2014/11/22 PHP
php四种定界符详解
2017/02/16 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
Python跳出循环语句continue与break的区别
2014/08/25 Python
对于Python装饰器使用的一些建议
2015/06/03 Python
python实现日常记账本小程序
2018/03/10 Python
python 处理string到hex脚本的方法
2018/10/26 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
python简单验证码识别的实现方法
2019/05/10 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
表扬信格式
2014/01/12 职场文书
四风问题查摆材料
2014/08/25 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android