2012-03-14 7 views
0

私は従業員が残業を救うことができるようにシンプルなシステムを開発していますので、月末には余分な時間を費やしています。時間を区別する方法は?

通常の時間は1とカウントされますが、夜間の時間は23:00から07:00まではそれぞれ1,25時間である必要があります。

私たちは、その日、開始日と終了日を紹介するように要求しています。だから、私はこのような配列を持っていると考えていた:

$hours= array(
    '0' => true, '1' => true, '2' => true, '3' => true, '4' => true, '5' => true, '6' => true, 
    '7' => false, '8' => false, '9' => false, '10' => false, '11' => false, '12' => false, '13' => false, 
    '14' => false, '15' => false, '16' => false, '17' => false, '18' => false, '19' => false, '20' => false, 
    '21' => false, '22' => false, '23' => true 
); 

ので、時間が特別であるか、それはこのようなループでない場合は基本的に私がテスト:

$normals = 0; 
$specials = 0; 
$hour_since = '23:00:00'; 
$hour_since_expl = explode(':',$hour_since); 
$hour_to = '23:15:00'; 
$hour_to_expl= explode(':',$hour_to); 
$date = $fecha = '2012-03-14'; 
$datetime_since= strtotime($date ." ".$hour_since); 
$datetime_to= ((int) $hour_to_expl[0] > (int) $hour_to_expl[0]) ? 
     strtotime(date("Y-m-d h:i:s", strtotime($date ." ".$hour_to)) . " +1 day") : 
     strtotime($date." ".$hour_to); 

$difference = $datetime_to - $datetime_since; 
$hours_difference = $difference/SECONDS_PER_HOUR; //60*60 
    for ($i = 0; $i <= $difference; $i++){ 
     $hour = $i + (int) $hour_since_expl [0]; 
     if ($hours[$hour]) //Special hour here... Pay more! 
      $specials++; 
     else 
      $normals++; 
    } 

しかし、問題時間が正確でなく、22:30のようなどこかで始まって00:30に終わったときは、0.5時間は特別ではありません。私は心に苦しんできましたが、私は解決策を見つけることができません。

誰かにアイデアはありますか?

:その他のコードがあります。

+1

私はPHPに精通していませんので、次のことができない場合は私を許してください。なぜループでそれを行うのですか?残業期間と定期的期間を取得し、料金を掛けるだけではどうですか? –

+0

どうすればいいですか?どのようにその期間を取得しますか? –

+0

開始時刻を15:15、終了時刻を22:45とします。まず、開始時刻をその時刻以降に最も近いHOURに変換し、endtimeをその時刻の前またはその直前のHOURに変換します。だから私たちは15:00と22:00になる。これらの時間にループを使用して、差異時間(15:15-15:00または22:45-22:00)が残業の場合は、残業* numMins/60は標準* numMins/60。私はPHPに精通していないので、擬似コードでこれを行う必要がありました –

答えて

1

開始時刻を15:15、終了時刻を22:45とします。まず、開始時刻をその時刻以降に最も近いHOURに変換し、endtimeをその時刻の前またはその直前のHOURに変換します。だから私たちは15:00と22:00になる。これらの時間にループを使用して、差異時間(15:15-15:00または22:45-22:00)が残業の場合は、残業* numMins/60は標準* numMins/60。私はPHPに精通していないので、擬似コードでこれを行う必要がありました

1

編集:ちょっと時間がかかりましたが、私はintresting chalangesを愛しています。

$specialStart = 23; 
$specialEnd = 7; 

$normals = 0; 
$specials = 0; 

$hour_since = '22:00:00'; 
$hour_since_expl = explode(':',$hour_since); 
$start_time = mktime($hour_since_expl[0], $hour_since_expl[1], $hour_since_expl[2]); 

$hour_to = '07:30:00'; 
$hour_to_expl= explode(':',$hour_to); 
$end_time = mktime($hour_to_expl[0], $hour_to_expl[1], $hour_to_expl[2]); 

if($end_time < $start_time){ 
    //worked passed minight, add a day 
    $end_time = $end_time + 86400; 
} 

$work_time = ($end_time - $start_time)/60; 

for($i = 0; $i < $work_time; $i++){ 
    $time = $start_time + ($i * 60); 
    $hour_of_day = date("H", $time); 
    if($hour_of_day >= $specialStart || $hour_of_day < $specialEnd){ 
     $specials += 60;  
    }else{ 
     $normals += 60; 
    } 
} 

$specials = $specials/3600; 
$normals = $normals/3600; 
echo "specials: ".$specials; 
echo "<br/>normals: ".$normals; 
+0

もっとコードが追加されました...ただの例 –

+0

ありがとう、私に何が来るか見てみましょう – MakuraYami

+0

編集されたポスト.... – MakuraYami

0

私は午前23時前に、通常の時間、すなわちを取得し、その後23:00以降07:00までに特別な時間、すなわち二つの別々のfields.Firstlyで合計時間を計算するために、あなたをお勧めします。

次に、簡単に支払いを計算することができます。

関連する問題