특정일과 특정한 간격을 사용하여 시간 대역을 생성 관리하는 클래스이다. 


예를들어 2018-03-03 부터 3일 간격의 대역을 만들어 낼 수 있으며,

특정일을 주었을 때 해당 구간의 시작일과 종료일을 구할 수 있다. 


/// <summary>

/// 특정 시작일부터 특정주기의 구간을 만들며, 특정일로 해당 구간의 시작일과 종료일을 구할 수 있다.

/// </summary>

public class TermManager

{

    private DateTime stdDate;

    private TimeSpan term;

    long lTerm;

 

    /// <summary>

    /// 기준일 부터 일정기간 텀을 주어 각 텀을 관리한다

    /// </summary>

    /// <param name="stdDate">기준일(언제부터)</param>

    /// <param name="term">(몇일, 몇시간 간격으로)</param>

    public TermManager(DateTime stdDate, TimeSpan term)

    {

        this.stdDate = stdDate;

        this.term = term;

        this.lTerm = term.Ticks;

    }

 

    /// <summary>

    /// foreach 등에서 사용할 수 있도록 coroutine 사용하여 미래의 텀을 구함

    /// </summary>

    /// <returns>IEnumerable</returns>

    public IEnumerable<Term> Terms()

    {

        for (int i = 0; i < int.MaxValue; i++)

        {

            DateTime start = stdDate.Add(new TimeSpan(lTerm * i));

            DateTime end = stdDate.Add(new TimeSpan((lTerm * (i + 1)) - 3));

 

            yield return new Term { StdDate = stdDate, Terms = term, StartDate = start, EndDate = end };

        }

    }

 

    /// <summary>

    /// foreach 등에서 사용할 수 있도록 coroutine 사용하여 과거의 텀을 구함

    /// </summary>

    /// <returns>IEnumerable</returns>

    public IEnumerable<Term> PreTerms()

    {

        for (int i = 0; i < int.MaxValue; i++)

        {

            DateTime start = stdDate.Add(new TimeSpan(-(lTerm * (i + 1))));

            DateTime end = stdDate.Add(new TimeSpan(-(lTerm * i + 3)));

 

            yield return new Term { StdDate = stdDate, Terms = term, StartDate = start, EndDate = end };

        }

    }

 

    /// <summary>

    /// 특정일이 속한 구간의 시작일과 종료일을 구한다

    /// </summary>

    /// <param name="curDate">특정일</param>

    /// <returns>Term Class로 시작일과 종료일이 있다</returns>

    public Term GetTerm(DateTime curDate)

    {

        Term term = new Term();

        if (stdDate <= curDate)

        {

            foreach (Term t in Terms())

            {

                if (t.StartDate <= curDate && curDate < t.EndDate)

                {

                    term = t;

                    break;

                }

            }

        }

        else

        {

            foreach (Term t in PreTerms())

            {

                if (t.StartDate <= curDate && curDate < t.EndDate)

                {

                    term = t;

                    break;

                }

            }

        }

        return term;

    }

 

    public class Term

    {

        public DateTime StdDate { get; set; }

        public TimeSpan Terms { get; set; }

        public DateTime StartDate { get; set; }

        public DateTime EndDate { get; set; }

 

 

        public override string ToString()

        {

            return String.Format("<Term> ( Start : {0}, End : {1} )", StartDate, EndDate);

        }

    }

}



대략적인 사용방법

TermManager manager = new TermManager(new DateTime(2000, 3, 27), new TimeSpan(7, 0, 0, 0));

TermManager.Term term = manager.GetTerm(new DateTime(2018, 3, 26));

TermManager.Term term2 = manager.GetTerm(new DateTime(2014, 3, 26));

 

int cnt = 0;

foreach (TermManager.Term t in manager.Terms())

{

    cnt++;

    Console.WriteLine(t.ToString());

    if (cnt > 4)

        break;

}


Posted by motolies
,