2012-08-03 105 views
0

我试图确定两个日期之间的日期间隔数。间隔可以是几个月,几天,几小时或用户选择的任何数量。如何查找PHP中两个日期之间的DateIntervals数

此刻我有一个使用递归的函数,但是,如果由于递归嵌套限制而导致两点之间存在超过100个间隔,则会中断。

private static function findCurrentInterval($initialStartTimestamp, $intervalStrtotimeFormat, $now = null, $period = 1) 
{ 
    if (is_null($now)){ 
     $now = time(); 
    } 

    $endOfCurrentInterval = strtotime($intervalStrtotimeFormat, $initialStartTimestamp); 

    if ($now > $initialStartTimestamp && $now < $endOfCurrentInterval){ 
     return new self($period); 
    }else{ 
     # increment the period ID tracking variable 
     $period++; 
     return self::findCurrentInterval($endOfCurrentInterval, $intervalStrtotimeFormat, $now, $period); 
    } 
} 

我需要出来的是代表我们对哪个时间间隔的周期在当前,也就是说,如果它被设置为7天间隔的整数值,20天已开始点之间传递现在,它会返回'3',因为我们会进入第三阶段。

有没有办法做到这一点没有递归,也许使用DateInterval?

N.B.如果将其限制在几天或几小时内,这将非常简单 - 但它需要支持几个月,这可能会有不同的长度。

回答

0

这似乎工作:

function findCurrentInterval($number, $type, $start, $end){ 

    $dt1 = DateTime::createFromFormat('Y-m-d H:i:s', $start); 
    $dt2 = DateTime::createFromFormat('Y-m-d H:i:s', $end); 
    $diff = $dt1->diff($dt2); 

    $numDays = (int) $diff->format('%a'); 
    $numMonths = (int) $diff->format('%m'); 
    $numYears = (int) $diff->format('%y'); 
    $numHours = (int) $diff->format('%h'); 

    if ($numYears > 0){ 
     $numMonths += ($numYears * 12); 
    } 

    $numHours += $numDays * 24; 


    switch ($type){ 
     case 'hours': 
      return floor($numHours/$number); 
     break; 
     case 'days': 
      return floor($numDays/$number); 
     break; 
     case 'months': 
      return floor($numMonths/$number); 
     break; 
     default: 
      throw new Exception('Interval type '.$type.' not implemented.'); 
    } 

} 

例子:

echo findCurrentInterval(3, 'hours', '2012-01-01 00:00:00', '2012-08-01 00:00:00'); 
echo findCurrentInterval(7, 'days', '2012-01-01 00:00:00', '2012-08-01 00:00:00'); 
echo findCurrentInterval(1, 'months', '2012-01-01 00:00:00', '2012-08-01 00:00:00'); 

输出:

1704 
30 
7 

和:

echo findCurrentInterval(3, 'hours', '2011-01-01 00:00:00', '2012-08-01 00:00:00'); 
echo findCurrentInterval(7, 'days', '2011-01-01 00:00:00', '2012-08-01 00:00:00'); 
echo findCurrentInterval(1, 'months', '2011-01-01 00:00:00', '2012-08-01 00:00:00'); 

输出:

4624 
82 
19 
0

这非常有助于全给你

试试这个

//日基地

$start_date = '20-07-2012'; 
$end_date = '22-07-2012'; 
$start = strtotime($start_date); 
$end = strtotime($end_date); 
$interval = 2; 
$out=''; 
$int = 24*60*60*$interval; 
for($i= $start;$i<= $end; $i += $int){ 

    echo date('d-m-Y',$i).'<br />'; 
} 

//月基地

$start_date = '20-07-2012'; 
$end_date = '22-12-2012'; 
$start = strtotime($start_date); 
$end = strtotime($end_date); 
$interval = 2; 

$int = 30*24*60*60*$interval; 
for($i= $start;$i<= $end; $i += $int){ 

    echo date('d-m-Y',$i).'<br />'; 
} 

//小时基地

$start_date = '20-07-2012'; 
$end_date = '22-12-2012'; 
$start = strtotime($start_date); 
$end = strtotime($end_date); 
$interval = 2; 

$int = 60*60*$interval; 
for($i= $start;$i<= $end; $i += $int){ 

    echo date('d-m-Y H:i:s',$i).'<br />'; 
} 
相关问题