加入收藏 | 设为首页 | 会员中心 | 我要投稿 荆门站长网 (https://www.0724zz.cn/)- 图像技术、建站、AI硬件、智能营销、数据搜素!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP 计算两个时间段之间交集的天数示例

发布时间:2022-07-24 10:02:32 所属栏目:PHP教程 来源:互联网
导读:今天小编就为大家分享一篇PHP 计算两个时间段之间交集的天数示例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。 废话不多说,我就直接上代码吧! /** * 计算两个时间段之间交集的天数 * @param $startDate1 开始日期1 * @param $endDa
  今天小编就为大家分享一篇PHP 计算两个时间段之间交集的天数示例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。
 
  废话不多说,我就直接上代码吧!
 
  /**
   * 计算两个时间段之间交集的天数
   * @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;
  }

(编辑:荆门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读