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 相关文章推荐
JAVA/JSP学习系列之六
Oct 09 PHP
由php if 想到的些问题
Mar 22 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
PHP及Zend Engine的线程安全模型分析
Nov 10 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
Laravel框架中扩展函数、扩展自定义类的方法
Sep 04 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
Jun 06 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 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
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
Python中装饰器高级用法详解
2017/12/25 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
高中军训感言500字
2014/02/24 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
消防安全员岗位职责
2014/03/10 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
Python学习之时间包使用教程详解
2022/03/21 Python