[DEV] 기록

[Java 8] yyyyMMddHHmmssSSS LocalDateTime parse 버그

꾸준함. 2021. 1. 27. 23:49

개요

로그에는 시간을 LocalDateTime 형태로 저장하지만 view에는 yyyy.MM.dd hh:mm:ss 형태로 뿌려줘야 했기 때문에 아래와 같이 LocalDateTime.parse 메서드와 DateTimeFormatter를 적용했습니다.

하지만, 예상과는 다르게 오류가 발생했는데 그 이유는 Java 8에서 아래와 같은 버그가 있기 때문이였습니다.

DateTimeFormatter won't parse dates with custom format "yyyyMMddHHmmssSSS"

 

[JDK-8031085] DateTimeFormatter won't parse dates with custom format "yyyyMMddHHmmssSSS" - Java Bug System

FULL PRODUCT VERSION : java version "1.8.0-ea" Java(TM) SE Runtime Environment (build 1.8.0-ea-b120) Java HotSpot(TM) 64-Bit Server VM (build 25.0-b62, mixed mode) ADDITIONAL OS VERSION INFORMATION : Windows 8.1 A DESCRIPTION OF THE PROBLEM : Java 8 produc

bugs.openjdk.java.net

 

해결방법

버그리포트 답변에 의하면 java 8에서는 아래와 같이 DateTimeFormatter를 정의하면 파싱 에러를 해결할 수 있습니다.

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

따라서, 구현하고자 했던 최종 코드는 아래와 같습니다.

public static LocalDateTime convertString2LocalDateTime(String dateTime) {
	try {
    	DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
            .appendPattern("yyyyMMddHHmmss")
            .appendValue(ChronoField.MILLI_OF_SECOND, 3)
            .toFormatter();
            
		return LocalDateTime.parse(dateTime, formatter);
    } catch (DateTimeParseException e) {
    	e.getStackTrace();
        
        // 예외처리
    }
}

 

[출처]

stackoverflow.com/questions/48520117/date-as-longvalue-to-localdatetime

반응형