개발자 블로그

MFC 월단위 날짜 계산을 위한 AddMonth 함수 구현 본문

프로그래밍/MFC

MFC 월단위 날짜 계산을 위한 AddMonth 함수 구현

로이드.Roid 2015. 8. 7. 15:37

MFC에서 날짜 계산을 하기 위해서 CTimeSpan을 사용한다.

하지만 CTimeSpan 클래스의 생성자는 최대 날짜단위의 계산을 제공한다.

그러니깐, 180일 전후의 날짜를 얻을 수는 있지만, 3개월 또는 6개월 뒤의 날짜를 얻기 위해서는 별도의 계산을 해야된다.


여기서 고려해야 될 사항

  • 월마다 일 수가 각각 다르다는 점(30일, 31일)
  • 윤년을 고려해야 된다는 점

이렇게 있다.



윤년계산방법은 아래와 같다.

  1. 년(year)을 4로 나눠서 나누어 떨어지면 윤년
  2. 다만 100으로 나누워서 떨어지면 윤년아님
  3. 다만 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 함수와 테스트 코드가 포함된 소스파일을 다운받으려면 아래 첨부파일을 클릭하세요.


addMonthTest.zip



Comments