【问题标题】:How can I find overlapping dateperiods/date ranges in PHP? [closed]如何在 PHP 中找到重叠的日期期间/日期范围? [关闭]
【发布时间】:2013-01-07 19:26:37
【问题描述】:

如果我有两个日期范围(例如 5 月 1 日 - 5 月 31 日和 5 月 23 日 - 6 月 5 日),那么在 PHP 中找出这两个时期重叠多少天的最佳方法是什么(所以它会返回 9)?有没有办法使用 DatePeriod 对象来做到这一点?

编辑以(希望)澄清我的问题:

基本上,我想要一个函数,给定任意两个日期范围,将返回两个日期范围之间共有的天数。如果有重叠,它将返回重叠天数,否则它将返回 0。我认为这可以通过为每个范围创建一个日期数组来完成,循环它们以找到相同的日期,并使用变量来计数匹配的数量 - 但我正在寻找更优雅的东西。

【问题讨论】:

  • 对不起,我应该更清楚。我想我可以为每个范围创建一个日期数组,遍历它们以找到相同的日期,并使用一个变量来计算匹配的数量。看起来这可能过于复杂,但如果有更基本的方法来使用 DatePeriod 做到这一点。我知道您可以使用 DateTime->diff 计算两个日期之间的差异,所以我虽然 DatePeriod 可能有类似的东西,但我在 Google 上运气不佳。也许像$dateperiod->diff($dateperiod2)
  • 好的,这个问题已被否决并关闭,这很好。但是我能做些什么来停止被否决?

标签: php date datetime compare overlap


【解决方案1】:

感谢@phpisuber01 和Determine Whether Two Date Ranges Overlap 提供了这里的基本逻辑。四个变量需要是 DateTime 对象:

function datesOverlap($start_one,$end_one,$start_two,$end_two) {

   if($start_one <= $end_two && $end_one >= $start_two) { //If the dates overlap
        return min($end_one,$end_two)->diff(max($start_two,$start_one))->days + 1; //return how many days overlap
   }

   return 0; //Return 0 if there is no overlap
}

【讨论】:

  • 为了完整,也可以反过来使用: if (($start_one = $start_two) || ($start_two = $start_one) ){ ... }
  • 以上评论不正确,不需要两个条件。
【解决方案2】:

没有任何真实信息作为此基础。下面是一个基本示例,说明如何使用DateTime 对象计算天差。

$datetime1 = new DateTime('2013-05-23');
$datetime2 = new DateTime('2013-05-31');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days'); //returns 8 days

我假设您知道如何将您的字符串转换为可用的时间戳/格式。

【讨论】:

  • 是的,我已经知道如何比较两个日期。我想要的是比较两个日期范围或 DatePeriods。即 $dateperiod1 与 $dateperiod2 重叠多少?
  • @Dustin 您需要做的就是获取第一个范围内的最后一个日期和最后一个范围内的第一个日期并进行比较。繁荣。
  • 谢谢。这在我给出的示例中有效,但我还应该提到,虽然其中一个范围是预设的,但另一个范围是由用户设置的,因此可能根本没有重叠。在这种情况下,将一个范围内的最后一个日期与另一个范围内的第一个日期进行比较会在它应该返回 0 时给出一个正数。
  • @Dustin 没有所有信息,就无法有人给你答案。您应该使用所有这些详细信息和您的尝试来更新您的问题。一些简单的逻辑将解决您对不真实日期间隔的任何担忧。
  • 是的,我不知道为什么我今天在写问题时遇到了这么多麻烦。我想可能是因为实际答案与我的预期不同,但即便如此,我也为没有足够详细和清晰而道歉。我认为你的建议让我很好地解决了一些问题,所以感谢你的耐心。一旦我弄清楚了,我将编辑我的问题并发布我的解决方案。
猜你喜欢
  • 2018-03-03
  • 2020-06-21
  • 2014-01-06
  • 1970-01-01
  • 2014-09-04
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多