web-dev-qa-db-ja.com

Java8のタイムゾーンでLocalDateTimeをフォーマットする

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

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)

この問題を解決するには?

86
carfield

LocalDateTime は、タイムゾーンのない日時です。タイムゾーンオフセットフォーマットシンボルをフォーマットで指定しましたが、LocalDateTimeにはそのような情報がありません。それがエラーが発生した理由です。

タイムゾーン情報が必要な場合は、 ZonedDateTime を使用する必要があります。

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

JSR-310の接頭辞「ローカル」(Java-8のJava.time-package)は、そのクラスの内部状態にタイムゾーン情報があることを示していません(ここでは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);
36
Meno Hochschild