147

私はこの簡単なコードを持っています:

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)

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

43

JSR-310 (別名 Java-8 の java.time-package) のプレフィックス「Local」は、そのクラスの内部状態 (ここでは: ) にタイムゾーン情報があることを示しませんLocalDateTime。誤解を招くことが多い名前にもかかわらず、そのようなクラスはタイムゾーン情報やオフセットが好きであるLocalDateTimeLocalTime、まったくありません。

このような時間型 (オフセットを含まない) をオフセット情報 (パターン記号 Z で示される) でフォーマットしようとしました。したがって、フォーマッタは利用できない情報にアクセスしようとし、観察した例外をスローする必要があります。

解決:

そのようなオフセットまたはタイムゾーン情報を持つ型を使用してください。JSR-310 では、これはOffsetDateTime(オフセットを含みますが、DST 規則を含むタイムゾーンを含まない) または のいずれかZonedDateTimeです。メソッドisSupported(TemporalField)を参照することで、そのようなタイプのサポートされているすべてのフィールドを監視できます。. フィールドOffsetSecondsは および でサポートされOffsetDateTimeていますが、 ではサポートされてZonedDateTimeいませんLocalDateTime

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
String s = ZonedDateTime.now().format(formatter);
于 2014-08-29T05:08:09.767 に答える