요구사항:
예) 외출 시간이 10:00 ~ 14:00 인 경우, 원래 4시간 이나, 점심시간 (12:00 ~ 13:00) 이 포함되면 해당 범위만큼 제외한 시간을 산정하도록 한다.
입력은 분단위 환산된 정수 값이다.
한계)
- 당일 시간단위의 계산에 한함. 일자가 변경되는 것 까지 고려하지는 않는다.
/* ----------------------------- * 2015.04.17 * Haebi, http://haebi.kr * ----------------------------- */ /// <summary> /// 특정 시간간격을 제외한 총 분단위 간격을 구한다. /// </summary> /// <param name="fromMin">시작분</param> /// <param name="toMin">종료분</param> /// <param name="exFromMin">제외시작분</param> /// <param name="exToMin">제외종료분</param> /// <returns></returns> private int checkDurMinutes(int fromMin , int toMin, int exFromMin, int exToMin) { if (toMin < fromMin) throw new Exception("checkDurMinutes() : 종료시간이 시작시간보다 작을 수 없습니다."); if (exToMin < exFromMin) throw new Exception("checkDurMinutes() : 제외종료시간이 제외시작시간보다 작을 수 없습니다.");
/** * 제외시킬 기간과 겹쳐질수 있는 4가지 케이스에 대하여 처리하고 있으며, * 해당없는 경우(겹쳐지지 않는경우) 그냥 to - from 처리로 끝난다. */ int _retMin = 0;
try { // -----<------|---------------|------>------ if (fromMin <= exFromMin && toMin >= exToMin) { _retMin = toMin - fromMin - (exToMin - exFromMin); } // ------------|---<------>----|------------- else if (fromMin >= exFromMin && toMin <= exToMin) { _retMin = 0; } // ------<-----|---------->----|------------- else if ((fromMin <= exFromMin) && (toMin >= exFromMin && toMin <= exToMin)) { _retMin = exFromMin - fromMin; } // ------------|----------<----|------>------ else if ((fromMin >= exFromMin && fromMin <= exToMin) && toMin >= exToMin) { _retMin = toMin - exToMin; } // ---<----->--|---------------|------------- // ------------|---------------|---<----->--- else { _retMin = toMin - fromMin; } } catch(Exception ex) { MessageBox.Show(ex.ToString()); }
return _retMin; } |
그리고 검증을 위한 테스트 코드
int min1 = 600; // 10:00 int min2 = 630; // 10:30 int dmin = 0;
for (int i = 0; i < 300;i++) { min2++; dmin = checkDurMinutes(min1, min2, 720, 780); printLog(i + 1, dmin, min1, min2); } |
printLog() 부분
private void printLog(int count, int dmin, int min1, int min2) { // 테스트 결과 출력 (단위:분) // 테스트 넘버 from ~ to 기간 from 분 to 분 textBox3.Text = textBox3.Text + "\r\n" + count.ToString() + "\t" + string.Format("{0:D2}", (dmin / 60)) + ":" + string.Format("{0:D2}", (dmin % 60)) + "\t" + string.Format("{0:D2}", (min1 / 60)) + ":" + string.Format("{0:D2}", (min1 % 60)) + "\t" + string.Format("{0:D2}", (min2 / 60)) + ":" + string.Format("{0:D2}", (min2 % 60)); } |
- textBox3 하나 추가해 주면 된다.
테스트 결과(샘플)
카운트 - (외출)시간 - 시작시간 - 종료시간
88 01:58 10:00 11:58 89 01:59 10:00 11:59 90 02:00 10:00 12:00 91 02:00 10:00 12:01 92 02:00 10:00 12:02 93 02:00 10:00 12:03 ...(생략) 148 02:00 10:00 12:58 149 02:00 10:00 12:59 150 02:00 10:00 13:00 151 02:01 10:00 13:01 152 02:02 10:00 13:02 153 02:03 10:00 13:03
|
- 1분단위로 종료시간을 더해가면서 실제 반영되는 시간이 얼마인지를 확인 한다.
- 테스트는 720(12:00) ~ 780(13:00) 까지의 범위에 대해 계산을 하지 않는 것으로 설정하였다.