기존 비베6.0 에서 DateADD, DateDiff, DatePart,DateSerial 등 날짜 관련 함수를 사용했는데 물론 닷넷 비베에서는 위 함수를 사용할 수 있습니다.. 하지만 닷넷 즉 프레임워크에 있는 System.DateTime 형을 가지고 사용해보고자 합니다.
실무에서도 가장 많이 사용하고 있으므로 혹시나 모르거나 비베6.0 코드를 가지고 하시는 분은 참고로 봐주시길 바람니다.
먼저 날짜와 관련해서 중요한 클래스인 TimeSpan(일종의 구조체인데 구조체도 클래스와 거의 같다고 봐도 됩니다.) 그리고 System.DateTime 에 있는 Subtract메서드만 있으면 가능합니다. TimeSpan는 시간간격을 나타내는 구조체입니다. 이 것으로 하면 상당히 편안하게 시간차이나 날짜간격을 구할수 있습니다 일반적으로 TimeSpan.Tostring() 을 해보면 "dd.hh:mm:ss"으로 나타내는데, 이것은 dd일, hh시간, mm분, ss초를 나타냅니다. 즉 두 개의 시간을 차이가 위와 같다고 보면 됩니다.
'//먼저 두개의 날짜형 데이터가 있다고 가정합니다. Dim t1 As DateTime = #3/31/2008 1:14:12 PM# Dim t2 As DateTime = #9/22/2008 6:39:45 PM#
'//그리고 TimeSpan을 하나 생성합니다. Dim TSpan As TimeSpan
'//그리고 위에 생성된 시간의 차이를 TimeSpan에 저장합니다. TSpan = t2.Subtract(t1)
'// TimeSpan의 속성과 메서드를 통해 시간간격과 날짜 간격알아냅니다. '//리스트박스 컨트롤에 내용을 표시한다. With ListBox1.Items .Add(TSpan.Seconds & "--초가 지났네요") .Add(TSpan.Minutes & "--분이 지났네요") .Add(TSpan.Hours & "--시간이 지났네요") .Add(TSpan.Days & "--일이 지났네요") .Add(CInt(TSpan.TotalSeconds) & " --TotalSecond") .Add(CInt(TSpan.TotalMinutes) & " --TotalMinutes") .Add(CInt(TSpan.TotalHours) & " --TotalHours") .Add(CInt(TSpan.TotalDays) & " --TotalDays") .Add(TSpan.ToString) End With 한 방에 알 수 있겠죠...
그리고 Total-메서드는 Double형으로 리턴해줍니다. 따라서 정수부분과 소수부문이 존재합니다. 하지만 단점이 있는데 월(Month),년(Year) 는 할수 가 없습니다. 물론 Days를 가지고 억지로 할수 는 있겠지만 TimeSpan에서는 차이는 구할 수 없습니다. 이때는 DateDiff함수 를 이용하면 됩니다. 이렇게 하면 되겠죠... DateDiff(DateInterval.Month, t1, t2) DateDiff(DateInterval.Year, t1, t2)
그리고 시간이나 날짜경과가 아닌 추가는 어떻게 하는지 알아보면 이 방법도 정말 쉽습니다. System.DateTime 클래스에 있는 ADD- 메서드를 이용하면 됩니다. 즉 기준날짜.AddDays(증가할 일수) : 기준 날짜에서 증가할 일수 를 더하거나 빼준다. 기준날짜.AddMonths(증가할 월수) : 기준 날짜에서 증가할 월수 를 더하거나 빼준다. 기준날짜.AddYears(증가할 년수) : 기준 날짜에서 증가할 년수 를 더하거나 빼준다. 그리고 이 값은 Date 형식으로 리턴해줍니다.
만약 t1.AddSeconds(55) 이렇게 하면 어떤 값으로 리턴할까요.. 2008-3-31 오후 1시15분 07초 로 리턴됩니다.
참고로 해당년의 해당월의 마지막날을 구하는 방법은 DateTime.DaysInMonth(년, 월) 이렇게 하면 됩니다. 만약 DateTime.DaysInMonth(2008, 2) 이렇게 하면 2008년의 2월달의 마지막날인 29가 반환됩니다.