2014-01-29 28 views
0

可以說我有以下日期範圍:計算時間和給定的時間限制

11:00 2014-01-10 - 2014年1月13日15:00

我也知道,我只能計算09:00至16:00之間的小時數,如何通過PHP實現這一點?但是,上面的日期範圍應該給我25小時(5 + 7 + 7 + 6),不知道這樣的PHP函數應該看起來如何。

+0

你嘗試過一些東西嗎? –

+0

當然,我設法將日期分成循環中的日期。雖然問題是計算每天給幾個小時。 – Undrium

+0

http://stackoverflow.com/a/3108800/2186023 – DrCopyPaste

回答

0

我現在已經提出了一個解決方案,但是如果僅僅是一天,我的計算就不會太滿意。這裏是代碼:

$startDate = strtotime("2014-01-22 15:00"); 
$endDate = strtotime("2014-01-24 18:00"); 

$time1 = new DateTime(date("H:i", $startDate)); 
$time2 = new DateTime(date("H:i", $endDate)); 
$date1 = new DateTime(date("Y-m-d", $startDate)); 
$date2 = new DateTime(date("Y-m-d", $endDate)); 

$start = new DateTime("11:00"); 
$end = new DateTime("18:00"); 

$maxPerDay = $end->diff($start)->format("%h") != 0 ? $end->diff($start)->format("%h") : 24; 
$days = $date2->diff($date1)->format("%a"); 

$hours = 0; 
//Is it just one day and is time intersecting? 
if($days == 0 && ($start <= $time2 && $time1 <= $end)){ 
    $hours = $maxPerDay; 
    if($start < $time1 || $end > $time2){ 
     if($time1 < $start){ 
      $hours = $maxPerDay - $time2->diff($end)->format("%h"); 
     }else if($time2 > $end){ 
      $hours = $maxPerDay - $time1->diff($start)->format("%h"); 
     }else{ 
      $hours = $time1->diff($time2)->format("%h"); 
     } 
    } 
}else if($days > 0){ 
    $firstDay = 0; 
    $lastDay = 0; 
    if($time1 < $end){ 
     $firstDay = $time1 < $start ? $maxPerDay : $maxPerDay - $time1->diff($start)->format("%h"); 
    } 
    if($time2 > $start){ 
     $lastDay = $time2 > $end ? $maxPerDay : $maxPerDay - $time2->diff($end)->format("%h"); 
    } 
    $hours = $lastDay + $firstDay + ($days - 1) * $maxPerDay; 
} 

echo $hours; 
3

完全未經測試,沒有任何varatny

<?php 
$time1 = new DateTime("11:00"); 
$time2 = new DateTime("15:00"); 
$date1 = new DateTime("2014-01-10"); 
$date2 = new DateTime("2014-01-13"); 

$start = new DateTime("9:00"); 
$end = new DateTime("16:00"); 

$maxperday = $end->diff($start)->format("%h"); 
$full_day_hours = ($date2->diff($date1)->format("%a")-1)*$maxperday; 
$first_day_hours = min($maxperday,max(0,$end->diff($time1)->format("%h"))); 
$last_day_hours = min($maxperday,max(0,$time2->diff($start)->format("%h"))); 

$hours = $first_day_hours + $full_day_hours + $last_day_hours; 
?> 

編輯:現在測試,糾正兩個誤區,似乎現在的工作。

+0

似乎工作,很好(謝謝!)。 – Undrium

+0

它符合你的規範,所以我想你應該重寫它們...... :) – Alexander

+0

當你在範圍內只有兩天,並且最後一天在開始時間之前結束時,就會出現問題。我在規範中使用的日期當然是任意的,應該是可變的。 2014-01-10 11:00至2014-01-11 08:00不會工作。 – Undrium