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 相关文章推荐
实用函数8
Nov 08 PHP
一步一步学习PHP(3) php 函数
Feb 15 PHP
Look And Say 序列php实现代码
May 22 PHP
PHP警告Cannot use a scalar value as an array的解决方法
Jan 11 PHP
一个PHP二维数组排序的函数分享
Jan 17 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
php函数重载的替代方法--伪重载详解
May 08 PHP
php检测文本的编码
Jul 26 PHP
Zend Framework入门教程之Zend_Mail用法示例
Dec 08 PHP
PHP与以太坊交互详解
Aug 24 PHP
PHP论坛实现积分系统的思路代码详解
Jun 01 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
php+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
python BeautifulSoup使用方法详解
2013/11/21 Python
python操作mysql数据库
2017/03/05 Python
django 创建过滤器的实例详解
2017/08/14 Python
python实现批量修改图片格式和尺寸
2018/06/07 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
python实现简易学生信息管理系统
2020/04/05 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
Python实现自动整理文件的脚本
2020/12/17 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
五月的鲜花活动方案
2014/08/21 职场文书
党在我心中演讲稿
2014/09/02 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
修改并编译golang源码的操作步骤
2021/07/25 Golang