사용용도
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;
아래와 같이 시작시간 , 종료시간을 입력하면 소요시간이 계산되서 나온다