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

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