2012-03-14 3 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시와 22시에 도착합니다. 이 시간 동안 루프를 사용하고 차이점을 다음과 같이 사용하십시오. 차이 시간 (15 : 15-15 : 00 또는 22 : 45-22 : 00)이 초과 근무 인 경우 초과 근무 * numMins/60 다른 경우 표준 * numMins/60. 나는 PHP에 익숙하지 않기 때문에 의사 코드로 이것을해야만한다. –

답변

1

시작 시간이 15:15이고 종료 시간이 22:45라고 가정 해 봅시다. 먼저 시작 시간을 가장 가까운 HOUR 또는 그 이후 시간으로 변환하고 endtime을 가장 가까운 HOUR 시간으로 변환하십시오. 그래서 우리는 15시와 22시에 도착합니다. 이 시간 동안 루프를 사용하고 차이점을 다음과 같이 사용하십시오. 차이 시간 (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:00 이후 07:00 전 23 : 후 특별한 시간 즉 정상적으로 시간 즉를 얻을 수 두 개의 별도 fields.Firstly에 총 시간을 계산하는 당신을 건의 할 것입니다.

그러면 급여를 쉽게 계산할 수 있습니다.

관련 문제