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之字符串变相相减的代码
Mar 19 PHP
php 静态页面中显示动态内容
Aug 14 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
关于PHPDocument 代码注释规范的总结
Jun 25 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
php获取图片信息的方法详解
Dec 10 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
Oct 14 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
Feb 17 PHP
PHP创建单例后台进程的方法示例
May 23 PHP
详细对比php中类继承和接口继承
Oct 11 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 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
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
目前最全的python的就业方向
2018/06/05 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
python实现超级玛丽游戏
2020/03/18 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
艺术用品:Arteza
2018/11/25 全球购物
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
国培教师自我鉴定
2014/02/12 职场文书
三万活动总结
2014/04/28 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
银行贷款委托书范本
2014/10/11 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle