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在线打包程序源码
Jul 27 PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
PHP超级全局变量数组小结
Oct 04 PHP
php设置静态内容缓存时间的方法
Dec 01 PHP
php简单统计在线人数的方法
May 10 PHP
PHP引用返回用法示例
May 28 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
10个值得深思的PHP面试题
Nov 14 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
Aug 17 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
php连接mysql数据库最简单的实现方法
Sep 24 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
用PHP4访问Oracle815
2006/10/09 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
微信公众平台天气预报功能开发
2014/07/06 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
Javascript Objects详解
2014/09/04 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
python改变日志(logging)存放位置的示例
2014/03/27 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
python实现多线程抓取知乎用户
2016/12/12 Python
一张图带我们入门Python基础教程
2017/02/05 Python
python flask实现分页效果
2017/06/27 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
python之生产者消费者模型实现详解
2019/07/27 Python
Python3离线安装Requests模块问题
2019/10/13 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
JAVA和C++的区别
2013/10/06 面试题
《小动物过冬》教学反思
2014/04/17 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
公司经营目标责任书
2015/01/29 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书