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 이상이면 가능)
반응형