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 相关文章推荐
一个用php3编写的简单计数器
Oct 09 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
Yii使用ajax验证显示错误messagebox的解决方法
Dec 03 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
Yii使用技巧大汇总
Dec 29 PHP
Symfony学习十分钟入门经典教程
Feb 03 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
Feb 26 PHP
PHP实现批量删除(封装)
Apr 28 PHP
PHP使用CURL实现下载文件功能示例
Jun 03 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 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批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
Js 中debug方式
2010/02/07 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
js读写json文件实例代码
2014/10/21 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
汽车促销活动方案
2014/03/31 职场文书
保护环境倡议书100字
2014/05/19 职场文书
企业委托书范本
2014/09/13 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
大学校园招聘会感想
2015/08/10 职场文书
Redis数据同步之redis shake的实现方法
2022/04/21 Redis