私はこの簡単なコードを持っています:
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の接頭辞「ローカル」(Java-8のJava.time-package)は、そのクラスの内部状態にタイムゾーン情報があることを示していません(ここではLocalDateTime
)。しばしば誤解を招く名前にもかかわらず、LocalDateTime
やLocalTime
のようなクラスには、タイムゾーン情報やオフセットがありません。
このようなテンポラルタイプ(オフセットを含まない)をオフセット情報(パターンシンボル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);