2015. 4. 17. 15:07




요구사항:

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




Posted by 해비