본문 바로가기
.NET C#

시작과 종료일 날짜 간격 구하는 로직

by 태디 2012. 5. 3.
728x90

간만에 C# 코드 하나 올립니다. 굉장히 오랜 시간동안 개발 관련 포스팅을 하지 않았는데
앞으로 기회가 또 있을지 모르겠지만 좋은 코드가 있으면 공유하겠습니다.

그리고 좋은방법 있으면 의견 주세요.....

 

using System;
using System.Collections.Generic;
using System.Text;

namespace DurationDay
{

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

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

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

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

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

            // 나머지
            int mod = duration % numerator;

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

            int add = 0;
            int i = 0;
            int addDay = 0;

            DateTime day = new DateTime();

            // 전체 날짜 기간이 20일 이상일 경우만 간격지정
            if (duration > numerator)
            {
                // 기간 등분만큼 Loop 반복
                do
                {
                    if (i == 0) // 시작일
                    {
                        day = fromDt;
                        add = 0;
                        addDay = 0;
                    }
                    else if (i == numerator) // 종료일
                    {
                        day = toDt;
                        add += portion;
                        addDay = portion;
                    }
                    else if (i >= 1 && i <= 19)
                    {
                        // 나머지 수 만큼 앞에서부터 +1을 더함
                        if (i <= mod)
                        {
                            add = i * (portion + 1);
                            addDay = (portion + 1);
                            day = fromDt.AddDays(add - 1);
                        }
                        else
                        {
                            add += (portion);
                            addDay = portion;
                            day = fromDt.AddDays(add);
                        }
                    }

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

                } while (i <= numerator);
            }

            Console.ReadLine();
        }

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

 

 

 

 

DurationDay.zip

 

소스 코드는 Visual Studio 2008 (.net 3.5) 환경에서 개발되었습니다.

받으신 다음 테스트 해보시면 금방 이해되실 수 있습니다.

numerator, 시작일, 종료일 값만 변경하여 테스트 하시면 됩니다.

 

 

댓글