26

javax.time.Instantローカル タイム ゾーンで a を文字列としてフォーマットするにはどうすればよいですか? 以下は、私が期待していたローカルタイムゾーンではなく、 localInstantUTCに変換します。への呼び出しを削除するとtoLocalDateTime()、同じことが行われます。代わりに現地時間を取得するにはどうすればよいですか?

public String getDateTimeString( final Instant instant )
{
    checkNotNull( instant );
    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
    DateTimeFormatter formatter = builder.appendPattern( "yyyyMMddHHmmss" ).toFormatter();
    return formatter.print( ZonedDateTime.ofInstant( instant, TimeZone.UTC ).toLocalDateTime() );
}

注: JSR-310リファレンス実装の古いバージョン0.6.3を使用しています。

4

4 に答える 4

40

ほぼ完成したJDK1.8バージョンについてこの質問に答える

DateTimeFormatter formatter =
  DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault());
return formatter.format(instant);

重要なのは、Instantタイムゾーン情報がないことです。したがって、「yyyyMMddHHmmss」などの日付/時刻フィールドに基づくパターンを使用してフォーマットすることはできません。でゾーンを指定することで、DateTimeFormatterフォーマット時にインスタントが指定されたタイムゾーンに変換され、正しく出力されるようになります。

別のアプローチは、次のように変換することZonedDateTimeです。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
return formatter.format(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()));

どちらのアプローチも同等ですが、データ オブジェクトがInstant.

于 2013-04-09T14:23:55.587 に答える
6

ローカル タイム ゾーンを使用する必要があるのはなぜですか? あなたは明示的にUTCを求めています:

ZonedDateTime.ofInstant(instant, TimeZone.UTC)

代わりにローカル タイム ゾーンを指定するだけです。

ZonedDateTime.ofInstant(instant, TimeZone.getDefault())
于 2012-12-06T20:39:31.930 に答える
1

これを試して:

String dateTime = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(
    ZonedDateTime.ofInstant(instant, ZoneId.systemDefault())
);

これは与える:

2014-08-25T21:52:07-07:00[America/Los_Angeles]

フォーマッタ以外のものを使用して、フォーマットを変更できますDateTimeFormatter.ISO_ZONED_DATE_TIME。DateTimeFormatter には、定義済みのフォーマッタが多数ありますが、独自に定義することもできます。

于 2014-08-26T05:27:45.733 に答える
1

私の回答に反対票を投じる前に、質問が明示的に (太字で) JSR-310 リファレンス実装の古いバージョン0.6.3を参照していることに注意してください。Java 8 と新しい日付ライブラリが登場するずっと前の 2012 年 12 月に、私はこの質問をしました。


DateTimeFormatter私は JSR-310 クラスをあきらめZonedDateTime、代わりに昔ながらのjava.util.Dateandに頼りましたjava.text.SimpleDateFormat:

public String getDateTimeString( final Instant instant )
{
    checkNotNull( instant );
    DateFormat format = new SimpleDateFormat( "yyyyMMddHHmmss" );
    Date date = new Date( instant.toEpochMillisLong() );
    return format.format( date );
}
于 2012-12-06T21:24:46.060 に答える