SimpleDateFormat YYYY 사용시 의도치 않은 버그

박상수
4 min readDec 30, 2019

2019-12-30 날짜 기준으로

SimpleDateFormat yyyymm = new SimpleDateFormat(“yyyyMM”)

위와 같은 코드를 실행시켰을때 202012 가 나오는 사태가 발생하였다.

201912가 아니고 202012라고??

그래서 stackoverflow를 뒤져보니 아래와 같은 답변을 찾을 수 있었다.

Use yyyyMMdd in stead. YYYY is for week Year (see javadoc) which might, depending on your Locale, sometimes return the 53rd week of the past year when using early jan dates or the 1st week of the new year when using late december dates.
(yyyyMMdd을 사용하십시오. YYYY는 주 년 (javadoc를 참조)이며, 로케일에 따라서는 1 월 상순 날짜를 사용하는 경우는 과거 1 년 53 주를 12 월 하순 날짜를 사용하는 경우 새해 1 주 눈을 반환 할 수 있습니다.)

자바 doc을 찾아 보면 명시가 되어 있는 것을 확인 할 수 있다.

아래 표를 보면 대문자 Y의 경우 Week year Component를 사용하는 것을 알 수 있다.

주 단위 component를 사용했을때 문제는 무엇인가??

365 / 7 = 52.142857....

위와 같은 계산으로 1년은 52.1주이며 53주가 되었을경우 12월 30일 같은 연말이 되었을경우 53주에 들어가므로 다음년으로 계산하는 오류를 발생시킬 수 있다.

결론

yyyyMM을 사용하면 된다.

참고

자바 1.7 이상에서만 Y를 사용할 수 있다.

위 내용을 보면

So the only problem is guess is your version of java < 1.7 because JRE1.7 has added ‘Y’ pattern for Week year and in JRE1.6 there is no pattern for this.
(JRE1.7가 주 년에 ‘Y’패턴을 추가하였고 JRE1.6에는이 패턴이 없기 때문에 Java 버전 <1.7 인 것으로 추측된다 것입니다.)

부가적인 설명 자바 doc을 보면 아래와 같은 내용도 있다.

If week year 'Y' is specified and the calendar doesn't support any week years, the calendar year ('y') is used instead. The support of week years can be tested with a call to getCalendar().isWeekDateSupported().
(주 년 ‘Y’가 지정되고 달력이 주를 지원하지 않으면 달력 연도 ( ‘y’)가 대신 사용됩니다. 주별 지원은 getCalendar (). isWeekDateSupported ()를 호출하여 테스트 할 수 있습니다.)

--

--