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对象Object的概念 介绍
Jun 14 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
PHP设置一边执行一边输出结果的代码
Sep 30 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
php中array_unshift()修改数组key注意事项分析
May 16 PHP
iOS+PHP注册登录系统 PHP部分(上)
Dec 26 PHP
php中请求url的五种方法总结
Jul 13 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 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
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
如何在PHP中进行身份认证
2006/10/09 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
PHP编写RESTful接口
2016/02/23 PHP
AJAX的使用方法详解
2017/04/29 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
详解vue-property-decorator使用手册
2019/07/29 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
python实现简单登陆流程的方法
2018/04/22 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
Python 如何创建一个线程池
2020/07/28 Python
一套Java笔试题
2016/08/20 面试题
《小石潭记》教学反思
2014/02/13 职场文书
工程质量月活动方案
2014/02/19 职场文书
小学生开学感言
2014/02/28 职场文书
六个一活动实施方案
2014/03/21 职场文书
十八大演讲稿
2014/05/22 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
思想政治表现评语
2015/01/04 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
以下牛机,你有几个
2022/04/05 无线电
Linux安装Docker详细教程
2022/07/07 Servers