2012-08-03 38 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 />'; 
} 
相關問題