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 相关文章推荐
多数据表共用一个页的新闻发布
Oct 09 PHP
php学习之数据类型之间的转换介绍
Jun 09 PHP
php自动加载机制的深入分析
Jun 08 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
php微信公众平台开发(四)回复功能开发
Dec 06 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
Dec 23 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
详解php实现页面静态化原理
Jun 21 PHP
PHP html_entity_decode()函数讲解
Feb 25 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
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
JS变量及其作用域
2017/03/29 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
从Python的源码来解析Python下的freeblock
2015/05/11 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
Python标准库itertools的使用方法
2020/01/17 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
python的json包位置及用法总结
2020/06/21 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
python中turtle库的简单使用教程
2020/11/11 Python
Python的信号库Blinker用法详解
2020/12/31 Python
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android