Language/Java

[Java8] yyyyMMddHHmmssSSS LocalDateTime parse 오류

devidea 2019. 7. 11. 15:48
최근에 yyyyMMddHHmmssSSS String 포멧으로 구성된 날짜형식을 LocalDateTime으로 바꾸는게 필요했다. 그런데 아래와 같이 LocalDateTime.parse 함수로 변환을 시도했는데 오류가 났다.

LocalDateTime converted = LocalDateTime.parse(field, DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));

처음 들었던 생각은 pattern에 들어가는 값을 잘못 알고 있었나 의심했다. 그래서 DateTimeFormatter에 기술된 pattern 내용을 찾아보았다.
대문자 S 값이 아래와 같이 밀리세컨드를 의미함을 확인하였다.

Symbol
Meaning
Presentation
Examples
S
fraction-of-second
fraction
978

어디서 잘못이 되었나 원인을 찾지 못하고 있을 때, 구글링으로 yyyyMMddHHmmssSSS를 뒤져보기 시작했다.
stackoverflow 결과에서 DateTimeFormatter에서 버그가 있다는 내용을 찾았다.
yyyyMMddHHmmssSSS parsing에 오류가 있으니 아래와 같이 적용해야 한다는 내용이었다.

DateTimeFormmaterBuilder의 appendPattern(), appendValue() 함수를 써서 formatter를 만드는 방법이었다.
이렇게 만든 formatter로 LocalDateTime parse() 함수를 호출하면 정상적으로 변환된다.

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmss")
  .appendValue(ChronoField.MILLI_OF_SECOND, 3).toFormatter()


참고 문서


반응형