BLOG main image
분류 전체보기 (68)
excel.101 (0)
rewind (9)
(3)
(2)
목공 (3)
(3)
me2day (0)
The Ethereal Void (9)
코드 (14)
귀찮은것 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2012. 7. 4. 18:35

이런 저런 작업을 하다보면, 두 일자를 포함하는 날짜 혹은 기간 범위는 꽤 많이 쓰이는 것 중에 하나인데, 이게 이상하게도 닷넷 코어 부분에 포함이 되어 있지 않다. 외국 사이트에 가끔 찾아보면 Period 같은 클래스를 작성해서 사용하기도 하던데, 끌어다 쓰긴 좀 그렇고, 자주 사용되는 것 중에 하나라 아예 필요한 부분 부분 따로 라이브러리로 작성해두었다.


이름은 DateRange (...)


구구절절 쓰면 골치 아프니, 바로 코드로 ... 

다음과 같이 사용이 가능하다.


// 2012년 1월 1일 0시부터 2012년 12월 31일 0시까지
DateRange year2012 = new DateRange(2012);
Console.WriteLine(String.Format("{0} ~ {1}"), year2012.Start, year2012.End));
// 또는
Console.WriteLine(year2012);
// output: 2012-01-01 ~ 2012-12-31

// 2012년 3월 전체
DateRange month201203 = new DateRange(2012, 3);
// 기간이 만월인지? 
Assert.IsTrue(month201203.IsFullMonth); // true !

// 2010년 부터 2012년까지
DateRange year2010to2012 = new DateRange(new DateTime(2010, 1, 1), new DateTime(2012, 12, 31));

// 오늘 날짜를 기준으로 이번 주 범위를 반환한다. 주 시작은 일요일에서 토요일까지 -
// 이 부분은 문화권 마다 다르게 처리해줘야 되는데, 아직 그 부분은 미구현.
// 근데 이렇게 시간에 따라 변하는 값을 정적 속성으로 처리하는게 왠지 꺼름직해서 (디자인 상으로 그다지 좋지 않다.) 지울 예정 -_-
DateRange thisWeek = DateRange.ThisWeek;

// 특정일자, 년도를 기준으로 분기, 반기 범위
// 2012년도의 1분기
DateRange firstQuaterOf2012 = DateRange.GetQuater(2012, 1);

// 2012년도의 후기
// 지정된 날짜를 기준으로 해당 년도의 반기를 반환
DateRange lastHalfYearOf2012 = DateRange.GetHalfYearly(new DateTime(2012, 7, 1));

// 범위 조작
DateRange period1 = new DateRange(new DateTime(2010, 1, 1), new DateTime(2010, 1, 11));
// 기간 끝날짜를 월말로 확장한다.
period1.ToMonthEnd();
Console.WriteLine(period1.End);
// output: 2010-01-31

// 1월에 3개월을 더하면? 4월이다. 4월달의 범위를 반환.
DateRange period2 = period1.AddMonths(3); // start: 2010-04-01, end: 2010-04-30 (말일이 31일이 아니라 30일이다. 중요)

// 2010년에 1년을 더하면 2011년 범위를 반환.
DateRange period3 = period2.AddYears(1);  // start: 2011-04-01, end: 2011-04-30

// 기간 그대로 앞 뒤로 이동이 가능하다. 이때 각 시작, 끝 날짜에 TimeSpan 기간에 대한 Add, Substract 연산이 처리된다.
period3.ShiftForward(TimeSpan.FromDays(10)); // 10일 이전 범위
period3.ShiftBackward(TimeSpan.FromDays(5)); // 5일 이후 범위

// 특정일자가 기간에 포함되는지 여부 확인
Assert.IsTrue(period1.Contains(new DateTime(2010, 1, 5))); // true !

// 기간의 각각 일자에 대한 반복처리
period1.ForEach(new Action(delegate(DateTime date)
{
// 1월 1일 부터 1월 31일까지 반복처리
}));

TimeSpan ts = period1.ToTimeSpan(); // 당연히 필요.

기능이 필요할때마다 그때 그때 확정했던 거라, 디자인이 좀 엉망이긴 하지만 ... 날짜 범위가지고 무식한 작업은  안하게 되었으니, 그걸로 만족. 구글코드에 당장 올리긴 힘들고, 일단 바이너리 파일만 사용하실 분은 첨부참조 ... (닷넷 프레임웍 2.0 이상이면 가능)



Vervain.Utils.Time.dll


Vervain.Utils.Time.XML


반응형