当前位置:首页 > PHP教程 > php日期 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-01-17 10:26:04 浏览: 评论:0 

今天小编就为大家分享一篇PHP 计算两个时间段之间交集的天数示例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

废话不多说,我就直接上代码吧!

  1. /** 
  2.  * 计算两个时间段之间交集的天数 
  3.  * @param $startDate1 开始日期1 
  4.  * @param $endDate1 结束日期1 
  5.  * @param $startDate2 开始日期2 
  6.  * @param $endDate2 结束日期2 
  7.  */ 
  8. public function share_date_days($startDate1, $endDate1, $startDate2, $endDate2) 
  9. { 
  10.   $days = 0; 
  11.   $startDate1 = strtotime($startDate1);// 开始日期1 
  12.   $endDate1 = strtotime($endDate1);// 结束日期1 
  13.   $startDate2 = strtotime($startDate2);// 开始日期2 
  14.   $endDate2 = strtotime($endDate2);// 结束日期2 
  15.    
  16.   /** ------------ 临界值换算 ------start------ */ 
  17.   // 如果日期1的结束日期小于日期二的开始日期,则返回0 
  18.   if($endDate1 < $startDate2){ 
  19.     $days = 0; 
  20.   } 
  21.   // 如果日期1的开始日期小于日期二的结束日期,则返回0 
  22.   if($startDate1 > $endDate2){ 
  23.     $days = 0; 
  24.   } 
  25.   // 如果日期1的结束日期等于日期2的开始日期,则返回1 
  26.   if($endDate1 == $startDate2){ 
  27.     $days = 1; 
  28.   } 
  29.   // 如果日期1的开始日期等于日期2的结束日期,则返回1 
  30.   if($startDate2 == $endDate1){ 
  31.     $days = 1; 
  32.   } 
  33.   /** ------------ 临界值换算 ------end------ */ 
  34.    
  35.   /** ------------ 交集换算 ------start------ */ 
  36.   // 如果开始日期1小于开始日期2,且开始日期2小于结束小于结束日期1 
  37.   if($startDate1 < $startDate2 && $endDate1 > $startDate2){ 
  38.     // 如果结束日期1小于或者等于结束日期2 
  39.     if($endDate1 <= $endDate2){ 
  40.       $days = $this->diffBetweenTwoDays($startDate2, $endDate1) + 1; 
  41.     } 
  42.     // 如果结束日期1大于结束日期2 
  43.     if($endDate1 > $endDate2){ 
  44.       $days = $this->diffBetweenTwoDays($startDate2, $endDate2) + 1; 
  45.     } 
  46.   } 
  47.    
  48.   // 如果开始日期1大于开始日期2,且开始日期1小于结束日期2 
  49.   if($startDate1 > $startDate2 && $startDate1 < $endDate2){ 
  50.     // 如果结束日期1小于等于结束日期2 
  51.     if($endDate1 <= $endDate2){ 
  52.       $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1; 
  53.     } 
  54.     // 如果结束日期1大于结束日期2 
  55.     if($endDate1 > $endDate2){ 
  56.       $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1; 
  57.     } 
  58.   } 
  59.   // 开始日期1等于开始日期2 
  60.   if($startDate1 == $startDate2){ 
  61.     // 结束日期1小于等于结束日期2 
  62.     if($endDate1 <= $endDate2){ 
  63.       $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1; 
  64.     } 
  65.     // 结束日期1大于结束日期2 
  66.     if($endDate1 > $endDate2){ 
  67.       $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1; 
  68.     } 
  69.   } 
  70.   // 结束日期1等于结束日期2 
  71.   if($endDate1 == $endDate2){ 
  72.     // 开始日期1小于等于开始日期2 
  73.     if($startDate1 <= $startDate2){ 
  74.       $days = $this->diffBetweenTwoDays($startDate2, $endDate1) + 1; 
  75.     } 
  76.     // 开始日期1大于开始日期2 
  77.     if($startDate1 > $startDate2){ 
  78.       $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1; 
  79.     } 
  80.    
  81.   } 
  82.   // 时间段1在时间段2内 
  83.   if($startDate1 >= $startDate2 && $endDate1 <= $endDate2){ 
  84.     $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1; 
  85.   } 
  86.   // 时间段1包含时间段2 
  87.   if($startDate1 < $startDate2 && $endDate1 > $endDate2){ 
  88.     $days = $this->diffBetweenTwoDays($startDate2, $endDate2) + 1; 
  89.   } 
  90.   /** ------------ 交集换算 ------end------ */ 
  91.    
  92.   return $days; 
  93. } 
  94.  
  95. /** 
  96.  * 求两个日期之间相差的天数 
  97.  * (针对1970年1月1日之后,求之前可以采用泰勒公式) 
  98.  * @param string $day1 
  99.  * @param string $day2 
  100.  * @return number 
  101.  */ 
  102. function diffBetweenTwoDays($day1, $day2) 
  103. { 
  104.   if ($day1 < $day2) { 
  105.     $tmp = $day2; 
  106.     $day2 = $day1; 
  107.     $day1 = $tmp; 
  108.   } 
  109.   return ($day1 - $day2) / 86400; 
  110. }

Tags: PHP计算两个时间段

分享到: