私は、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は変換されませんし、別のがあるのですか?
説明してくれてありがとう!
瞬間を保存対日の時間を保存
私は中心線を一つずつ説明します。
Calendar calendar = Calendar.getInstance();
これは、作成しCalendar
、あなたのJVMのデフォルトのタイムゾーンと同じタイムゾーンに。違った時間帯を得ました。Date
Calendar
calendar.set(zdf.getYear(),zdf.getMonthValue(),zdf.getDayOfMonth(),
zdf.getHour(),zdf.getMinute(),zdf.getSecond());
これは、あなたが設定されますCalendar
同じに壁時計の時間、あなたのようにZonedDateTime
、すなわち、午前12時13分14秒。以来ZonedDateTime
とCalendar
異なるタイムゾーン(それぞれUTCとローカルタイムゾーン、)、異なった瞬間に、この結果を持っています。
また@VGRが正しいこと:の日付は、一方でZonedDateTIme
月(5ヶ月)にあった、あなたが設定されているCalendar
ので、6月に月にCalendar
数ヶ月が紛らわしい0ベースされている12月のために11を介して1月は0から、。
Date d2 = Date.from(instant);
これは、より正確な変換であるInstant
とDate
し、あなたの時間で同じポイントを与え、同じ瞬間Instant
。そして、そのためではないと同じ瞬間Calendar
とdt
。
そして、それはおそらく私が直接の状態に希望に沿ってあなたの質問ではなく、誰の読み取りのために理解したDate
とCalendar
貧弱に設計されており、長い時代遅れ。あなたが変更することはできませんか、単に今すぐアップグレードしたくないという従来のAPIと対話するために必要なときを除き、それらを使用するべきではありません。すべての他の用途のために、java.timeに近代的なJavaの日付と時刻APIを貼り付けます。
リンク
- java.util.Dateに関するすべてのジョンスキートのコードブログで
- スタックオーバーフローの質問:なぜ1月の月0は、Javaのカレンダーにありますか?