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 相关文章推荐
用PHP4访问Oracle815
Oct 09 PHP
调整优化您的LAMP应用程序的5种简单方法
Jun 26 PHP
php中存储用户ID和密码到mysql数据库的方法
Feb 06 PHP
PHP-Fcgi下PHP的执行时间设置方法
Aug 02 PHP
php除数取整示例
Apr 24 PHP
smarty中js的调用方法示例
Oct 27 PHP
微信公众平台开发实现2048游戏的方法
Apr 15 PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
Jul 07 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
python进程与线程小结实例分析
Nov 11 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 模板高级篇总结
2006/12/21 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
js 数组操作代码集锦
2009/04/28 Javascript
javaScript call 函数的用法说明
2010/04/09 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
JS实现吸顶特效
2020/01/08 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
python实现批量获取指定文件夹下的所有文件的厂商信息
2014/09/28 Python
Python的time模块中的常用方法整理
2015/06/18 Python
python万年历实现代码 含运行结果
2017/05/20 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
NumPy排序的实现
2020/01/21 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
C#面试问题
2016/07/29 面试题
商务英语本科生的自我评价分享
2013/11/15 职场文书
应届大学生求职信
2013/12/01 职场文书
总会计师岗位职责
2014/02/19 职场文书
五一手机促销方案
2014/03/08 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
销售业务员岗位职责
2015/02/13 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python