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

PHP如何计算两个时间段交集的天数?

发布:smiling 来源: PHP粉丝网  添加日期:2022-06-13 08:45:23 浏览: 评论:0 

本篇文章给大家通过代码示例介绍一下PHP如何计算两个时间段交集的天数。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

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

  1. /** 
  2.  
  3.  * 计算两个时间段之间交集的天数 
  4.  
  5.  * @param $startDate1 开始日期1 
  6.  
  7.  * @param $endDate1 结束日期1 
  8.  
  9.  * @param $startDate2 开始日期2 
  10.  
  11.  * @param $endDate2 结束日期2 
  12.  
  13.  */ 
  14.  
  15. public function share_date_days($startDate1, $endDate1, $startDate2, $endDate2) 
  16.  
  17. { 
  18.  
  19.   $days = 0; 
  20.  
  21.   $startDate1 = strtotime($startDate1);// 开始日期1 
  22.  
  23.   $endDate1 = strtotime($endDate1);// 结束日期1 
  24.  
  25.   $startDate2 = strtotime($startDate2);// 开始日期2 
  26.  
  27.   $endDate2 = strtotime($endDate2);// 结束日期2 
  28.  
  29.     
  30.  
  31.   /** ------------ 临界值换算 ------start------ */ 
  32.  
  33.   // 如果日期1的结束日期小于日期二的开始日期,则返回0 
  34.  
  35.   if($endDate1 < $startDate2){ 
  36.  
  37.     $days = 0; 
  38.  
  39.   } 
  40.  
  41.   // 如果日期1的开始日期小于日期二的结束日期,则返回0 
  42.  
  43.   if($startDate1 > $endDate2){ 
  44.  
  45.     $days = 0; 
  46.  
  47.   } 
  48.  
  49.   // 如果日期1的结束日期等于日期2的开始日期,则返回1 
  50.  
  51.   if($endDate1 == $startDate2){ 
  52.  
  53.     $days = 1; 
  54.  
  55.   } 
  56.  
  57.   // 如果日期1的开始日期等于日期2的结束日期,则返回1 
  58.  
  59.   if($startDate2 == $endDate1){ 
  60.  
  61.     $days = 1; 
  62.  
  63.   } 
  64.  
  65.   /** ------------ 临界值换算 ------end------ */ 
  66.  
  67.     
  68.  
  69.   /** ------------ 交集换算 ------start------ */ 
  70.  
  71.   // 如果开始日期1小于开始日期2,且开始日期2小于结束小于结束日期1 
  72.  
  73.   if($startDate1 < $startDate2 && $endDate1 > $startDate2){ 
  74.  
  75.     // 如果结束日期1小于或者等于结束日期2 
  76.  
  77.     if($endDate1 <= $endDate2){ 
  78.  
  79.       $days = $this->diffBetweenTwoDays($startDate2, $endDate1) + 1; 
  80.  
  81.     } 
  82.  
  83.     // 如果结束日期1大于结束日期2 
  84.  
  85.     if($endDate1 > $endDate2){ 
  86.  
  87.       $days = $this->diffBetweenTwoDays($startDate2, $endDate2) + 1; 
  88.  
  89.     } 
  90.  
  91.   } 
  92.  
  93.     
  94.  
  95.   // 如果开始日期1大于开始日期2,且开始日期1小于结束日期2 
  96.  
  97.   if($startDate1 > $startDate2 && $startDate1 < $endDate2){ 
  98.  
  99.     // 如果结束日期1小于等于结束日期2 
  100.  
  101.     if($endDate1 <= $endDate2){ 
  102.  
  103.       $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1; 
  104.  
  105.     } 
  106.  
  107.     // 如果结束日期1大于结束日期2 
  108.  
  109.     if($endDate1 > $endDate2){ 
  110.  
  111.       $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1; 
  112.  
  113.     } 
  114.  
  115.   } 
  116.  
  117.   // 开始日期1等于开始日期2 
  118.  
  119.   if($startDate1 == $startDate2){ 
  120.  
  121.     // 结束日期1小于等于结束日期2 
  122.  
  123.     if($endDate1 <= $endDate2){ 
  124.  
  125.       $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1; 
  126.  
  127.     } 
  128.  
  129.     // 结束日期1大于结束日期2 
  130.  
  131.     if($endDate1 > $endDate2){ 
  132.  
  133.       $days = $this->diffBetweenTwoDays($startDate1, $endDate2) + 1; 
  134.  
  135.     } 
  136.  
  137.   } 
  138.  
  139.   // 结束日期1等于结束日期2 
  140.  
  141.   if($endDate1 == $endDate2){ 
  142.  
  143.     // 开始日期1小于等于开始日期2 
  144.  
  145.     if($startDate1 <= $startDate2){ 
  146.  
  147.       $days = $this->diffBetweenTwoDays($startDate2, $endDate1) + 1; 
  148.  
  149.     } 
  150.  
  151.     // 开始日期1大于开始日期2 
  152.  
  153.     if($startDate1 > $startDate2){ 
  154.  
  155.       $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1; 
  156.  
  157.     } 
  158.  
  159.     
  160.  
  161.   } 
  162.  
  163.   // 时间段1在时间段2内 
  164.  
  165.   if($startDate1 >= $startDate2 && $endDate1 <= $endDate2){ 
  166.  
  167.     $days = $this->diffBetweenTwoDays($startDate1, $endDate1) + 1; 
  168.  
  169.   } 
  170.  
  171.   // 时间段1包含时间段2 
  172.  
  173.   if($startDate1 < $startDate2 && $endDate1 > $endDate2){ 
  174.  
  175.     $days = $this->diffBetweenTwoDays($startDate2, $endDate2) + 1; 
  176.  
  177.   } 
  178.  
  179.   /** ------------ 交集换算 ------end------ */ 
  180.  
  181.     
  182.  
  183.   return $days; 
  184.  
  185. }  
  186.  
  187. /** 
  188.  
  189.  * 求两个日期之间相差的天数 
  190.  
  191.  * (针对1970年1月1日之后,求之前可以采用泰勒公式) 
  192.  
  193.  * @param string $day1 
  194.  
  195.  * @param string $day2 
  196.  
  197.  * @return number 
  198.  
  199.  */ 
  200.  
  201. function diffBetweenTwoDays($day1, $day2) 
  202.  
  203. { 
  204.  
  205.   if ($day1 < $day2) { 
  206.  
  207.     $tmp = $day2; 
  208.  
  209.     $day2 = $day1; 
  210.  
  211.     $day1 = $tmp; 
  212.  
  213.   } 
  214.  
  215.   return ($day1 - $day2) / 86400; 
  216.  
  217. }

Tags: PHP计算两个时间段交集天数

分享到: