2016-11-18 3 views
0

カレンダーインスタンスを使用して、ライトの節約が終了してから標準時間に移行する1時間を減算する際に、この問題が発生しています。javaカレンダーのDST問題

Date startTime = new Date();// Gives me Sun Nov 06 01:26:16 EST 2016 
Calendar temp; 
TimeZone timezone = TimeZone.getDefault(); //Eastern 
temp= Calendar.getInstance(timezone); 
temp.setTime(startTime); 
temp.add(Calendar.HOUR_OF_DAY, -1); 
temp.set(Calendar.MILLISECOND, 0); 
    Date endDate = temp.getTime(); // This is still Sun Nov 06 01:26:16 EST 2016 

私はendDateにに期待する結果が日11月6日である1時26分16秒EDT 2016の代わりに日11月6日の午前1時26分16秒EST 2016この場合、私はわからない:ここ コードです設計通りであるか否かである。私が2時間を引くと、うまく働いているのがわかります。 これに関する入力はありますか?

おかげで、 SS

答えて

1

今レガシーよりもあなたがjava.timeクラスではなく、そのようなCalendarなど面倒な古い日時のクラスを使用する必要がありますjava.time

を使用します。

ZonedDateTimeのクラス文書を必ず読んで、夏時間(DST)カットオフの処理方法の選択を理解してください。

は、America/MontrealAfrica/Casablanca、又はPacific/Aucklandとして、continent/regionの形式でproper time zone nameを指定します。 ESTまたはEDTまたはISTのような3〜4文字の略語は、ではなく、で、標準化されておらず、ユニークではありません(!)ので、決して使用しないでください。

ZoneId z = ZoneId.of("America/New_York"); 
// of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone) 
ZonedDateTime zdt = ZonedDateTime.of(2016 , 11 , 6 , 1 , 26 , 16 , 0 , z); 
ZonedDateTime zdtOneHourEarlier = zdt.minusHours(1); 
ZonedDateTime zdtOneHourLater = zdt.plusHours(1); 

各結果のオフセットからのオフセットに注意してください。

zdt.toString():2016-11-06T01:26:16-04:00 [アメリカ/ニューヨーク]

zdtOneHourEarlier.toString():2016-11-06T00:26:16- 4:00 [アメリカ/ニューヨーク]

zdtOneHourLater.toString():2016-11-06T01:26:16から05:00 [アメリカ/ニューヨーク]

このコードrun live at IdeOne.comを参照してください。 java.timeについて


java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題