요구사항:
예) 외출 시간이 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:00int 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:5889    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) 까지의 범위에 대해 계산을 하지 않는 것으로 설정하였다.