PHP 计算两个时间段之间交集的天数示例


Posted in PHP onOctober 24, 2019

废话不多说,我就直接上代码吧!

/**
 * 计算两个时间段之间交集的天数
 * @param $startDate1 开始日期1
 * @param $endDate1 结束日期1
 * @param $startDate2 开始日期2
 * @param $endDate2 结束日期2
 */
public function share_date_days($startDate1, $endDate1, $startDate2, $endDate2)
{
  $days = 0;
  $startDate1 = strtotime($startDate1);// 开始日期1
  $endDate1 = strtotime($endDate1);// 结束日期1
  $startDate2 = strtotime($startDate2);// 开始日期2
  $endDate2 = strtotime($endDate2);// 结束日期2
 
  /** ------------ 临界值换算 ------start------ */
  // 如果日期1的结束日期小于日期二的开始日期,则返回0
  if($endDate1 < $startDate2){
    $days = 0;
  }
  // 如果日期1的开始日期小于日期二的结束日期,则返回0
  if($startDate1 > $endDate2){
    $days = 0;
  }
  // 如果日期1的结束日期等于日期2的开始日期,则返回1
  if($endDate1 == $startDate2){
    $days = 1;
  }
  // 如果日期1的开始日期等于日期2的结束日期,则返回1
  if($startDate2 == $endDate1){
    $days = 1;
  }
  /** ------------ 临界值换算 ------end------ */
 
  /** ------------ 交集换算 ------start------ */
  // 如果开始日期1小于开始日期2,且开始日期2小于结束小于结束日期1
  if($startDate1 < $startDate2 && $endDate1 > $startDate2){
    // 如果结束日期1小于或者等于结束日期2
    if($endDate1 <= $endDate2){
      $days = $this->diffBetweenTwoDays($startDate2, $endDate1) + 1;
    }
    // 如果结束日期1大于结束日期2
    if($endDate1 > $endDate2){
      $days = $this->diffBetweenTwoDays($startDate2, $endDate2) + 1;
    }
  }
 
  // 如果开始日期1大于开始日期2,且开始日期1小于结束日期2
  if($startDate1 > $startDate2 && $startDate1 < $endDate2){
    // 如果结束日期1小于等于结束日期2
    if($endDate1 <= $endDate2){
      $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1;
    }
    // 如果结束日期1大于结束日期2
    if($endDate1 > $endDate2){
      $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1;
    }
  }
  // 开始日期1等于开始日期2
  if($startDate1 == $startDate2){
    // 结束日期1小于等于结束日期2
    if($endDate1 <= $endDate2){
      $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1;
    }
    // 结束日期1大于结束日期2
    if($endDate1 > $endDate2){
      $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1;
    }
  }
  // 结束日期1等于结束日期2
  if($endDate1 == $endDate2){
    // 开始日期1小于等于开始日期2
    if($startDate1 <= $startDate2){
      $days = $this->diffBetweenTwoDays($startDate2, $endDate1) + 1;
    }
    // 开始日期1大于开始日期2
    if($startDate1 > $startDate2){
      $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1;
    }
 
  }
  // 时间段1在时间段2内
  if($startDate1 >= $startDate2 && $endDate1 <= $endDate2){
    $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1;
  }
  // 时间段1包含时间段2
  if($startDate1 < $startDate2 && $endDate1 > $endDate2){
    $days = $this->diffBetweenTwoDays($startDate2, $endDate2) + 1;
  }
  /** ------------ 交集换算 ------end------ */
 
  return $days;
}
/**
 * 求两个日期之间相差的天数
 * (针对1970年1月1日之后,求之前可以采用泰勒公式)
 * @param string $day1
 * @param string $day2
 * @return number
 */
function diffBetweenTwoDays($day1, $day2)
{
  if ($day1 < $day2) {
    $tmp = $day2;
    $day2 = $day1;
    $day1 = $tmp;
  }
  return ($day1 - $day2) / 86400;
}

以上这篇PHP 计算两个时间段之间交集的天数示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php中的MVC模式运用技巧
May 03 PHP
PHP调用Webservice实例代码
Jul 29 PHP
php无限遍历文件夹示例分享
Mar 04 PHP
php警告Creating default object from empty value 问题的解决方法
Apr 02 PHP
PHP把数字转成人民币大写的函数分享
Jun 30 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
Mar 15 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
PHP实现发送微博消息功能完整示例
Dec 04 PHP
如何通过PHP实现Des加密算法代码实例
May 09 PHP
php去除数组中为0的元素的实例分析
Nov 17 PHP
PHP Swoole异步MySQL客户端实现方法示例
Oct 24 #PHP
laravel 查询数据库获取结果实现判断是否为空
Oct 24 #PHP
Laravel实现ORM带条件搜索分页
Oct 24 #PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 #PHP
Laravel监听数据库访问,打印SQL的例子
Oct 24 #PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 #PHP
浅谈laravel aliases别名的原理
Oct 24 #PHP
You might like
德生PL660的电路分析和打磨
2021/03/02 无线电
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
浅谈PHP的反射机制
2016/12/15 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
node.js基于express使用websocket的方法
2017/11/09 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
在Python中使用dict和set方法的教程
2015/04/27 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
现金会计岗位职责
2013/12/05 职场文书
大学新生欢迎词
2014/01/10 职场文书
会计辞职信范文
2014/01/15 职场文书
大四自我鉴定
2014/02/08 职场文书
大学四年个人自我小结
2014/03/05 职场文书
农村葬礼主持词
2014/03/31 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
简易版租房协议书范本
2014/10/13 职场文书
会议营销主持词
2015/07/03 职场文书
跳高加油稿
2015/07/21 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
golang 在windows中设置环境变量的操作
2021/04/29 Golang