본문 바로가기
.NET C#

시작일과 종료일 기간 체크 및 날짜 등분

by 태디 2012. 5. 5.
728x90

이전 코드에서는 시작일과 종요일 기간이 나눈 등분기간 보다 짧을때

 

가령 등분이 15일인데 실제 기간은 4일일경우 4일 이후는 같은 값이

계속 나오는 문제가 있었습니다. 이와 같은 경우는 단순하게 1씩 더해서

시작일과 종료일 기간만큼만 화면에 출력하고 종료하는 로직으로 변경하였습니다.

 /// <summary>
 /// 어떤 시작과 종료 되는 시점의 기간(duration)을 일정 지정한 간격만큼
 /// 배분하는 로직
 /// </summary>
 class Program
 {
     static void Main(string[] args)
     {
         // 시작/종료일
         string fromDate = "2012-05-01";
         string toDate = "2012-05-05";
         int portion = 0;
         int mod = 0;

         int addCount = 0;
         int i = 0;
         int addDay = 0;

         DateTime day = new DateTime();

         // 시작/종료일 날짜형 변환
         DateTime fromDt = DateTime.Parse(fromDate);
         DateTime toDt = DateTime.Parse(toDate);

         // 날짜 기간 (분모)
         int duration = DayCount(fromDt, toDt);

         // 기간 등분 (분자)
         int numerator = 14;

         if (duration > numerator)
         {
             // 날짜 사이의 간격(몫)
             portion = duration / numerator;

             // 나머지
             mod = duration % numerator;

             // 기간 등분만큼 Loop 반복
             do
             {
                 // 나머지 수 만큼 앞에서부터 +1을 더함
                 if (i <= mod)
                 {
                     addCount = i * (portion + 1);
                     addDay = portion + 1;
                     day = fromDt.AddDays(addCount);
                 }
                 else
                 {
                     addCount += (portion);
                     addDay = portion;
                     day = fromDt.AddDays(addCount);
                 }

                 i++;

                 Console.WriteLine("NO : {0} : {1} / {2} / {3}",
                                    i >= 10 ? i.ToString() : "0" + i.ToString(),
                                    day.ToString("yyyy-MM-dd"), addCount, addDay);
             } while (i <= numerator);
         }
         else
         {
             // 시작일과 종료일의 기간이 등분한 날짜보다 작을때...
             // 전체 날짜 표시
             for (; i <= duration; i++)
             {
                 numerator = addCount;

                 addCount = i;
                 addDay = addCount;
                 day = fromDt.AddDays(addCount);
                 int disCnt = i + 1;

                 Console.WriteLine("NO : {0} : {1} / {2} / {3}",
                                 disCnt >= 10 ? disCnt.ToString() : "0" + disCnt.ToString(),
                                 day.ToString("yyyy-MM-dd"), addCount, addDay);
             }
         }

         Console.WriteLine("duration : {0}", duration);
         Console.WriteLine("numerator : {0}", numerator);
         Console.WriteLine("portion : {0}", portion);
         Console.WriteLine("mod : {0}", mod);


         Console.ReadLine();
     }

     static int DayCount(DateTime fromDt, DateTime ToDt)
     {
         TimeSpan ts = ToDt - fromDt;
         return ts.Days;
     }

기간이 짧을경우

 

기간이 긴경우

 

 

DurationDay.zip
다운로드

 

 

댓글