なぜ私のJVMのタイムゾーンで日付を表すDateオブジェクトではありませんか?

jejjejd:

私は、UTCの日付を持っていると私は、UTC(レガシー上の理由)とまったく同じ値でDateオブジェクトを作成する必要があります。

私はそれを行うために管理しています:

String date = "2012-05-05 12:13:14";
TemporalAccessor formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        .withZone(ZoneId.of("UTC"))
        .parse(date);
Instant instant = Instant.from(
        formatter
); //
ZonedDateTime zdf = ZonedDateTime.ofInstant(instant,ZoneId.of("UTC"));
Calendar calendar = Calendar.getInstance();
calendar.set(zdf.getYear(),zdf.getMonthValue(),zdf.getDayOfMonth(),zdf.getHour(),zdf.getMinute(),zdf.getSecond());
Date dt = calendar.getTime();

Date d2 = Date.from(instant);

しかし、何が私を悩まします -

私は日付オブジェクトを作成すると、それは私のJVMのデフォルトのタイムゾーンに日付を表示する必要があります。しかし、ここでdt私の入力UTC日付とまったく同じ値を持っていますが、dt2同じ日付が私のデフォルトのタイムゾーンで表されており、これはなぜ起こるのですか?なぜ1は変換されませんし、別のがあるのですか?

説明してくれてありがとう!

オレVV:

瞬間を保存対日の時間を保存

私は中心線を一つずつ説明します。

    Calendar calendar = Calendar.getInstance();

これは、作成しCalendar、あなたのJVMのデフォルトのタイムゾーンと同じタイムゾーンに。違っ時間帯を得ました。DateCalendar

    calendar.set(zdf.getYear(),zdf.getMonthValue(),zdf.getDayOfMonth(),
            zdf.getHour(),zdf.getMinute(),zdf.getSecond());

これは、あなたが設定されますCalendar同じに壁時計の時間、あなたのようにZonedDateTime、すなわち、午前12時13分14秒。以来ZonedDateTimeCalendar異なるタイムゾーン(それぞれUTCとローカルタイムゾーン、)、異なった瞬間に、この結果を持っています。

また@VGRが正しいこと:の日付は、一方でZonedDateTIme月(5ヶ月)にあった、あなたが設定されているCalendarので、6月に月にCalendar数ヶ月が紛らわしい0ベースされている12月のために11を介して1月は0から、。

    Date d2 = Date.from(instant);

これは、より正確な変換であるInstantDateし、あなたの時間で同じポイントを与え、同じ瞬間Instantそして、そのためではないと同じ瞬間Calendardt

そして、それはおそらく私が直接の状態に希望に沿ってあなたの質問ではなく、誰の読み取りのために理解したDateCalendar貧弱に設計されており、長い時代遅れ。あなたが変更することはできませんか、単に今すぐアップグレードしたくないという従来のAPIと対話するために必要なときを除き、それらを使用するべきではありません。すべての他の用途のために、java.timeに近代的なJavaの日付と時刻APIを貼り付けます。

リンク

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=236087&siteId=1