我如何找到两个日期范围内的常见日期/天

问题描述 投票:1回答:3

我想找出days/dates之间的共同点two periods

例如

[period1 - 25/10/2010 - 25-11-2010 ] and [ period2 - 10-11-2010 - 10-12-2010 ]

这里15 days26-1010-11是共同的。如何在PHP或Zend Framework中找到它。

php zend-framework
3个回答
0
投票

使用NullUserException的建议方法

date_default_timezone_set('GMT');


$period1 = array('25-10-2010','25-11-2010');
$period2 = array('10-11-2010','10-12-2010');

$p1 = range(strtotime($period1[0]),strtotime($period1[1]),86400);
$p2 = range(strtotime($period2[0]),strtotime($period2[1]),86400);

$r = array_intersect($p1,$p2);

foreach($r as $date) {
 echo $date,' - ',date('d-M-Y H:i:s',$date),'<br />';
}

0
投票
$nb_days = (strtotime($period1[1])-strtotime($period2[0])) / 86400

应该工作。


0
投票

请参阅此SO答案以获取更多信息:https://stackoverflow.com/a/2970328/781153

以及PHP中的相应代码:

$period1 = ['25-10-2010', '25-11-2010'];
$period2 = ['10-11-2010', '10-12-2010'];
$dates = [
    'p1start' => new DateTime($period1[0]),
    'p1end' => new DateTime($period1[1]),
    'p2start' => new DateTime($period2[0]),
    'p2end' => new DateTime($period2[1])
];
$start = max($dates['p1start'], $dates['p2start']);
$end = min($dates['p1end'], $dates['p2end']);
$days = $start->diff($end);
var_dump($days);

结果:

object(DateInterval)[694]
[...]
  public 'invert' => int 0
  public 'days' => int 15
[...]

请注意,如果没有普通的日子,invert属性可能是1。在没有重叠的情况下获得零天的解决方案是:

$commonDays = $start > $end ? 0 : $start->diff($end)->days;
© www.soinside.com 2019 - 2024. All rights reserved.