2019-12-30 날짜 기준으로
SimpleDateFormat yyyymm = new SimpleDateFormat(“yyyyMM”)
위와 같은 코드를 실행시켰을때 202012 가 나오는 사태가 발생하였다.
201912가 아니고 202012라고??
그래서 stackoverflow를 뒤져보니 아래와 같은 답변을 찾을 수 있었다.
Use
yyyyMMdd
in stead.YYYY
is forweek Year
(see javadoc) which might, depending on yourLocale
, 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 togetCalendar()
.isWeekDateSupported()
.
(주 년 ‘Y’가 지정되고 달력이 주를 지원하지 않으면 달력 연도 ( ‘y’)가 대신 사용됩니다. 주별 지원은 getCalendar (). isWeekDateSupported ()를 호출하여 테스트 할 수 있습니다.)