1. ホーム

[解決済み】InstantをStringにフォーマットする際にUnsupportedTemporalTypeExceptionが発生する。

2022-03-27 11:57:43

質問

新しいJava 8 Date and Time APIと次のパターンを使用して、InstantをStringにフォーマットしようとしています。

Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);

上記のコードを使用すると、サポートされていないフィールドについて文句を言う例外が発生します。

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
    at java.time.Instant.getLong(Instant.java:608)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    ...

解決方法は?

タイムゾーン

をフォーマットするには Instant a 時間帯 が必要です。time-zone がないと、フォーマッタはその瞬間を人間の日付時間フィールドに変換する方法を知らないので、例外をスローします。

タイムゾーンは、フォーマッタに直接追加するには withZone() .

DateTimeFormatter formatter =
    DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT )
                     .withLocale( Locale.UK )
                     .withZone( ZoneId.systemDefault() );

タイムゾーンを明示しないISO-8601形式を特に希望する場合 (OPの質問のように)。 タイムゾーンを暗黙のうちにUTCとした場合 が必要です。

DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.from(ZoneOffset.UTC))

文字列の生成

このフォーマッターを使用して、InstantのString表現を生成します。

Instant instant = Instant.now();
String output = formatter.format( instant );

コンソールにダンプする。

System.out.println("formatter: " + formatter + " with zone: " + formatter.getZone() + " and Locale: " + formatter.getLocale() );
System.out.println("instant: " + instant );
System.out.println("output: " + output );

実行時

formatter: Localized(SHORT,SHORT) with zone: US/Pacific and Locale: en_GB
instant: 2015-06-02T21:34:33.616Z
output: 02/06/15 14:34