分享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 相关文章推荐
资料注册后发信小技巧
Oct 09 PHP
实时抓取YAHOO股票报价的代码
Oct 09 PHP
精通php的十大要点(上)
Feb 04 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
如何使用php判断服务器是否是HTTPS连接
Jul 05 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 PHP
Netbeans 8.2将支持PHP7 更精彩
Jun 13 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
浅谈laravel aliases别名的原理
Oct 24 PHP
TP5框架实现签到功能的方法分析
Apr 05 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服务端图片生成缩略图的方法详解
2013/06/20 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
php编程每天必学之验证码
2016/03/03 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
JS:window.onload的使用介绍
2013/11/13 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
js获取url传值的方法
2015/12/18 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
python集合用法实例分析
2015/05/30 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
写好求职信第一句话的技巧
2013/10/26 职场文书
运动会通讯稿500字
2014/02/20 职场文书
优秀求职信
2014/05/29 职场文书
环卫工人节活动总结
2014/08/29 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
亲情作文之母爱
2019/09/25 职场文书
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python