经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
PHP 计算两个时间段之间交集的天数示例
来源:jb51  时间:2019/10/24 12:07:06  对本文有异议

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

  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. }
  1. /**
  2. * 求两个日期之间相差的天数
  3. * (针对1970年1月1日之后,求之前可以采用泰勒公式)
  4. * @param string $day1
  5. * @param string $day2
  6. * @return number
  7. */
  8. function diffBetweenTwoDays($day1, $day2)
  9. {
  10. if ($day1 < $day2) {
  11. $tmp = $day2;
  12. $day2 = $day1;
  13. $day1 = $tmp;
  14. }
  15. return ($day1 - $day2) / 86400;
  16. }

以上这篇PHP 计算两个时间段之间交集的天数示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号