Java8에서 시간대로 LocalDateTime 형식 지정


121

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

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)

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

답변:


212

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

시간대 정보를 원하면 ZonedDateTime.

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

3
매우 유용합니다. 내가 그렇게 쉽게 시간대를 잡았을 지 모르겠다. 좋은 대답입니다. 감사합니다!
Laran 에반스

40

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);

혼동을 피하기 위해 접두사 "Local"을 어떤 접두사로 바 꾸었습니까?
Matthew

@Matthew Bank Credit Suisse에서 이름 등을 제안한 논쟁 도있었습니다 PlainDateTime. 접두사 "plain"이 날짜-시간 이상의 것이 없다는 것을 나타 내기 때문에 아마도 더 좋을 것입니다. 우리가 아직 Java v1.0 이전 이었다면 접두사가 더 좋지 않았을 것입니다. 그러나 Dateetc. 와 같은 이름 은 이미 이전 JDK에 의해 예약되어 있습니다.
Meno Hochschild 2016 년

-4

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.