특정일, 특정간격(term)을 사용하여 특정한 시간대역 관리 클래스
특정일과 특정한 간격을 사용하여 시간 대역을 생성 관리하는 클래스이다.
예를들어 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;
}