Java8에서 시간대로 LocalDateTime 형식 지정 코드가 있습니다. DateTimeFormatter

이 간단한 코드가 있습니다.

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
LocalDateTime.now().format(FORMATTER)

그러면 다음 예외가 발생합니다.

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.LocalDateTime.getLong(LocalDateTime.java:720)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$OffsetIdPrinterParser.format(DateTimeFormatterBuilder.java:3315)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
at java.time.LocalDateTime.format(LocalDateTime.java:1746)

이 문제를 해결하는 방법은 무엇입니까?



답변

LocalDateTime시간대가없는 날짜-시간입니다. 형식에 시간대 오프셋 형식 기호를 지정했지만 해당 LocalDateTime정보가 없습니다. 그것이 오류가 발생한 이유입니다.

시간대 정보를 원하면 ZonedDateTime.

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
ZonedDateTime.now().format(FORMATTER);
=> "20140829 14:12:22.122000 +09"

답변

JSR-310의 접두사 “Local”(Java-8의 java.time-package)은 해당 클래스의 내부 상태 (여기서는 LocalDateTime)에 시간대 정보가 있음을 나타내지 않습니다 . 종종 오해의 소지가있는 이름에도 불구하고 이러한 클래스 는 시간대 정보 또는 오프셋 과 같 LocalDateTime거나 LocalTime전혀 없습니다 .

오프셋 정보 (패턴 기호 Z로 표시됨)를 사용하여 이러한 임시 유형 (오프셋을 포함하지 않음)을 형식화하려고했습니다. 따라서 포맷터는 사용할 수없는 정보에 액세스하려고 시도하고 관찰 한 예외를 throw해야합니다.

해결책:

이러한 오프셋 또는 시간대 정보가있는 유형을 사용하십시오. JSR-310에서 이것은 OffsetDateTime(오프셋은 포함하지만 DST 규칙을 포함하는 시간대는 포함하지 않음) 또는 ZonedDateTime. isSupported (TemporalField) 메서드를 조회하여 이러한 유형의 지원되는 모든 필드를 확인할 수 있습니다 . . 이 필드 OffsetSecondsOffsetDateTimeZonedDateTime에서 지원 되지만에서는 지원 되지 않습니다 LocalDateTime.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
String s = ZonedDateTime.now().format(formatter);

답변

LocalDateTime.now (). format (DateTimeFormatter.ofPattern ( “yyyyMMdd HH : mm : ss.SSSSSS Z”));