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 Evans

40

JSR-310(Java-8では別名java.time-package)の接頭辞「Local」は、そのクラスの内部状態(ここでは:)にタイムゾーン情報があることを示していませんLocalDateTime。以下のような多くの場合、誤解を招くような名前などのクラスにもかかわらず、LocalDateTimeまたはLocalTimeNOタイムゾーン情報またはオフセットを持っています

オフセット情報(パターンシンボルZで示される)を使用して、このような一時的なタイプ(オフセットを含まない)をフォーマットしようとしました。そのため、フォーマッタは利用できない情報にアクセスしようとし、観察した例外をスローする必要があります。

解決:

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

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

混乱を避けるために、接頭辞「ローカル」をどの接頭辞に置き換えますか?
マシュー

@Matthewまた、名前などを提案するBank Credit Suisseによって開始された議論もありましたPlainDateTime。「プレイン」という接頭辞は単なる日時以外のものがないことを示しているため、おそらくより良いでしょう。Java v1.0より前の場合は、プレフィックスは適切ではありませんが、Dateなどの名前は古い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.