319

新しいJava 8 Date and Time APIと次のパターンを使用して、インスタントを文字列にフォーマットしようとしています:

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)
    ...
4

7 に答える 7

444

タイムゾーン

タイムゾーンをフォーマットするInstantには必須です。タイムゾーンがないと、フォーマッタはインスタントを人間の日付/時間フィールドに変換する方法がわからないため、例外がスローされます。

を使用して、タイムゾーンをフォーマッタに直接追加できます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 の文字列表現を生成します。

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
于 2014-12-15T11:48:50.913 に答える
19

インスタントはすでに UTC であり、デフォルトの日付形式は yyyy-MM-ddです。あなたがそれに満足していて、タイムゾーンやフォーマットを台無しにしたくない場合は、次のこともできますtoString():

Instant instant = Instant.now();
instant.toString()
output: 2020-02-06T18:01:55.648475Z


T と Z は必要ありませんか? (Z は、この日付が UTC であることを示します。Z は、"Zulu" 別名 "Zero hour offset" 別名 UTC を表します):

instant.toString().replaceAll("[TZ]", " ")
output: 2020-02-06 18:01:55.663763


ナノ秒ではなくミリ秒が必要ですか? (したがって、それをSQLクエリに入れることができます):

instant.truncatedTo(ChronoUnit.MILLIS).toString().replaceAll("[TZ]", " ")
output: 2020-02-06 18:01:55.664

于 2020-02-06T18:32:02.683 に答える
-3
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
String text = date.toString(formatter);
LocalDate date = LocalDate.parse(text, formatter);

これが役立つと思います。インスタントではなく、ある種の localdate バリエーションを使用する必要があるかもしれません

于 2014-08-10T13:50:34.520 に答える