개발자 블로그
MFC 월단위 날짜 계산을 위한 AddMonth 함수 구현 본문
MFC에서 날짜 계산을 하기 위해서 CTimeSpan을 사용한다.
하지만 CTimeSpan 클래스의 생성자는 최대 날짜단위의 계산을 제공한다.
그러니깐, 180일 전후의 날짜를 얻을 수는 있지만, 3개월 또는 6개월 뒤의 날짜를 얻기 위해서는 별도의 계산을 해야된다.
여기서 고려해야 될 사항은
- 월마다 일 수가 각각 다르다는 점(30일, 31일)
- 윤년을 고려해야 된다는 점
이렇게 있다.
윤년의 계산방법은 아래와 같다.
- 년(year)을 4로 나눠서 나누어 떨어지면 윤년
- 다만 100으로 나누워서 떨어지면 윤년아님
- 다만 400으로 나누워서 떨어지면 윤년
이런 사항들을 고려해서 만든 fnAddMonth 라는 함수다.
CTime fnAddMonth(CTime& _time, int _month)
{
CTime new_time;
new_time = _time;
for(int i=0; i<_month; i++)
{
int MonthDays[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
// 윤년인 경우 처리
if (
(new_time.GetYear() % 400 == 0) // 400으로 나누어 떨어지면 윤년
|| ((new_time.GetYear() % 100 != 0) && (new_time.GetYear() % 4 == 0)) // 4로 나누어 떨어지면 윤년, 다만 100으로 나누어 떨어지면 윤년아님
)
{
MonthDays[2] = 29;
}
new_time += CTimeSpan(MonthDays[new_time.GetMonth()],0,0,0);
}
return new_time;
}
윤년에 관한 정보는 아래 링크를 참고했다.
사실 구현에 대한 아이디어도 위 링크에서 얻었다. pjmssb님에게 감사를~!!
아, 참고로 위 함수는 + 계산만 가능하고, 몇 개월 이전의 날짜는 계산이 안된다.
다만 소스를 조금만 고치면 +, - 모두 처리 되도록 할 수 있다.
fnAddMonth 함수와 테스트 코드가 포함된 소스파일을 다운받으려면 아래 첨부파일을 클릭하세요.
'프로그래밍 > MFC' 카테고리의 다른 글
트레이 아이콘 컨텍스트 메뉴 띄울 때 시스템 메뉴가 같이 뜨는 문제 (0) | 2017.07.23 |
---|---|
RichEdit 컨트롤 syntax highlighting 속도를 빠르게.. (0) | 2016.12.25 |
ZipArchive 라이브러리 사용시 v3로 인한 압축해제 에러 해결 (0) | 2016.04.15 |
MFC - 윈도우 시스템 날짜 변경 코드 (0) | 2015.08.08 |
MFC - MAC 주소 얻기 (0) | 2015.08.08 |