[wd_asp elements='search' id=9]

두 날짜 비교하여 실제 근무 시간 제작 PHP 스니펫 만들기

사용용도

ACF를 통해 시간을 입력받아서 두시간 사이의 근무시간을 계산할 때 사용한다

예를 들어서 근무시간이 09:00 ~ 18:00 까지 고정이고, 실제 내가 11월 1일 00시 부터 11월 5일 00시까지 일을 했다면
총 시간은 5일 X 24시간 = 120시간이지만 실제 근무 시간은 아니다 (안 자고 5일동안 24시간 일을 하면 맞다!)
실제 근무 시간은 5일 X 9시간 = 45시간이 실제 근무 시간 이다

실제 근무시간을 계산해서 표기하기 위해서 쓰이며, 토요일,일요일은 휴무일이기 때문에 계산에서 제외도 하게 되어있으며, 공휴일도 지정하면 계산에서 제외 가능하다

준비물

  • 워드프레스
  • 코드스니펫 플러그인
  • acf 플러그인
  • elementor (선택 사항)
  • ae elementor 플러그인(선택 사항)

코드

//근무시간 계산 함수
function get_working_sec($ini_str,$end_str,$st_time,$end_time){
    //config
    $ini_time = [$st_time,0]; //hr, min
    $end_time = [$end_time,0]; //hr, min
    //date objects
    $ini = date_create($ini_str);
    $ini_wk = date_time_set(date_create($ini_str),$ini_time[0],$ini_time[1]);
    $end = date_create($end_str);
    $end_wk = date_time_set(date_create($end_str),$end_time[0],$end_time[1]);
    //days
    $workdays_arr = get_workdays($ini,$end);
    $workdays_count = count($workdays_arr);
    $workday_seconds = (($end_time[0] * 60 + $end_time[1]) - ($ini_time[0] * 60 + $ini_time[1])) * 60;
    //get time difference
    $ini_seconds = 0;
    $end_seconds = 0;
    if(in_array($ini->format('Y-m-d'),$workdays_arr)) $ini_seconds = $ini->format('U') - $ini_wk->format('U');
    if(in_array($end->format('Y-m-d'),$workdays_arr)) $end_seconds = $end_wk->format('U') - $end->format('U');
    $seconds_dif = $ini_seconds > 0 ? $ini_seconds : 0;
    if($end_seconds > 0) $seconds_dif += $end_seconds;
    //final calculations
    $working_seconds = ($workdays_count * $workday_seconds) - $seconds_dif;
    //echo $ini_str.' - '.$end_str.'; Working Hours:'.($working_seconds / 3600).b();
    return max($working_seconds,0); //return hrs
}
//공휴일 및 휴무일 제외 계산 함수
function get_workdays($ini,$end){
    //config
    $skipdays = [6,0]; //토요일 : 6, 일요일 : 0
    $skipdates = []; //요일 제외: ['2016-10-10'];
    //vars
    $current = clone $ini;
    $current_disp = $current->format('Y-m-d');
    $end_disp = $end->format('Y-m-d');
    $days_arr = [];
    //days range
    while($current_disp <= $end_disp){
        if(!in_array($current->format('w'),$skipdays) && !in_array($current_disp,$skipdates)){
            $days_arr[] = $current_disp;
        }
        $current->add(new DateInterval('P1D')); //adds one day
        $current_disp = $current->format('Y-m-d');
    }
    return $days_arr;
}
//호출 함수
function ebo_renseigne_num_affiliation1($value, $post_id, $field) {
	if ( get_post_type($post_id)=='memory') {  
	    $start_time = get_field('시작_시간');
		$end_time = get_field('종료_시간'); 
		//date_default_timezone_set("Asia/Seoul");
		$dt1 = strtotime($start_time);
		$dt2 = strtotime($end_time);
		$SecResult = get_working_sec($start_time, $end_time,'9','18');
		$value = $SecResult;	
		     
	}
	return $value;
}

코드 풀이

get_working_sec(시작날짜,종료날짜,근무시작시간,근무종료시간)

을 기입하면 총 근무시간이 초단위로 반환이 된다

	$SecResult = get_working_sec($start_time, $end_time,'9','18');
	$value = $SecResult;	

아래와 같이 시작시간 , 종료시간을 입력하면 소요시간이 계산되서 나온다

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top