티스토리 뷰

728x90

문자열로 온 text 값을 LocalDateTime으로 parsing 해야 할 작업이 생겼다.

그런데 형식도 보통 yyyyMMddhhmmss 형식이 아니라 밀리세컨드까지 포함된 형식에 yyyy도 아닌 뒤에 yy만 들어오는 형태였다.

Date: 120220 (20/2/2012)
Time: 6150525 (6:15:05.250)

이렇게 들어온다..

첫번째로 yyyy가 아닌 yy부터 날짜까지만 파싱이 되는지 확인해봤다.

LocalDateTime yyMMddhhmmss = LocalDateTime.parse("220811165340", DateTimeFormatter.ofPattern("yyMMddHmmss"));
System.out.println("yyMMddhhmmss = " + yyMMddhhmmss);

//결과: yyMMddhhmmss = 2022-08-11T16:53:40

이건 잘 나온다. 다행이다.

다음에 밀리세컨드까지 넣어서 파싱 하려고 했다.

LocalDateTime yyMMddhhmmssSS = LocalDateTime.parse("22081116534060", DateTimeFormatter.ofPattern("yyMMddHmmssSS"));
System.out.println("yyMMddhhmmssSS = " + yyMMddhhmmssSS);

// Error!

밀리 세컨드까지 파싱하려면 yyMMddhhmmss 뒤에 S를 붙이면 된다고해서 붙였는데 오류..

java.time.format.DateTimeParseException: Text '22081116534060' could not be parsed at index 14

	at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
	at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
	at java.time.LocalDateTime.parse(LocalDateTime.java:492)
    ....

막 찾아보다가 Java8의 오류라는 걸 찾아내었다. Java8에서 DateTimeFormatter의 yyyyMMddHHmmssSSS의 오류가 있어서 아래와 같은 DateTimeFormatter를 새로 만들어서 그걸로 포매터를 적용해야 한다고 한다.

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

실제로 적용을 해봤다.
(아 그런데 내 상황의 경우 밀리세컨드가 SSS로 안들어오고 SS로 들어오는데..일단 이건 패스.. 테스트는 0을 하나 더 붙였다.)

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

LocalDateTime yyMMddHmmssSSS = LocalDateTime.parse("220811165340600", dateTimeFormatter);
System.out.println("yyMMddHmmssSSS = " + yyMMddHmmssSSS);

//결과: yyMMddHmmssSSS = 2022-08-11T16:53:40.600

된다. 그런데 가장 쉬운 다른 해결 방법으로는 그냥 java11로 올리면 된다.
(java 11로 올리면 yyMMddHmmssSS 의 형식도 알아서 잘 된다.)
시간이 좀 있으니 서버의 자바 버전을 11로 올려야겠다..!

참고

https://jaimemin.tistory.com/1540

[Java 8] yyyyMMddHHmmssSSS LocalDateTime parse 버그

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

jaimemin.tistory.com

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함