2012-04-06 4 views
2

3つのグレゴリオ暦の日付をJavaで調整したいのですが、24時間前にもう1つ48時間前と最後の78時間前私はCalendar.HOURを使用していて、これをCalendar.HOUR_OF_DAYに変更しました。グレゴリオ暦の日付を24時間、48時間、78時間に調整してHOUR_OF_DAYを使用するようにするには

私はこれを実行して以来、私のコードは動作を停止しました。私は調整した日付をdate1.before(date2)とdate1.after(date2)を使ってcompareflag を取得するメソッドを使って、元の値と比較しています。これは1または0になり、私のコードで使用します。

私は、上記の を達成するために、私の日付でHOUR_OF_DAYを調整する方法を知りました。

+0

72時間、または78時間? –

答えて

2

いくつかのコードはいいと思います。カレンダーのjavadocツールから

::私は問題を正しく理解している場合でも、

HOUR is used for the 12-hour clock. E.g., at 10:04:15.250 PM the HOUR is 10. 
HOUR_OF_DAY is used for the 24-hour clock. E.g., at 10:04:15.250 PM the HOUR_OF_DAY is 22. 

日から時間をsubstracting /追加:

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.HOUR, -24); 
cal.add(Calendar.HOUR_OF_DAY, -24); 

これは、同じ効果を持っている必要があります。

1

TL; DR

ZonedDateTime.now()    // Capture the current moment as seen through the lens of wall-clock time used by the people of a certain region, a time zone. Better to pass the expected/desired time zone as an optional argument. 
      .minusHours(24) // Do the math, get earlier moment. 

java.timeに取って代わられ、今のレガシーあるのJavaの最初のバージョンにバンドルCalendar

面倒Calendarクラスと関連する日付時刻クラスは、使用しないでください。クラス。

java.time

時間帯は日付を決定する上で重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。

タイムゾーンが指定されていない場合、JVMは現在のデフォルトタイムゾーンを暗黙的に適用します。そのデフォルトはいつでも変更される可能性がありますので、結果は異なる場合があります。期待どおりのタイムゾーンを明示的に引数として指定する方がよいでしょう。

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

ZoneId z = ZoneId.of("America/Montreal") ; 

キャプチャする現在の瞬間をZonedDateTimeオブジェクトとして要求するときは、そのタイムゾーンを使用します。

ZonedDateTime zdt = ZonedDateTime.now(z) ; 

JVMの現在のデフォルトタイムゾーンを使用する場合は、それを求めて引数として渡します。省略すると、JVMの現在のデフォルトが暗黙的に適用されます。明示的にすることをお勧めします。

ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone. 

目標の時間数を減算します。

ZonedDateTime zdtMinus24h = zdt.minusHours(24) ; 
ZonedDateTime zdtMinus48h = zdt.minusHours(48) ; 
ZonedDateTime zdtMinus72h = zdt.minusHours(72) ; 

isBeforeisAfter、およびisEqual方法と比較してください。また、Comparableが実装されています。

また、追加する時間数をDurationとして表すこともできます。

Duration d = Duration.ofHours(24) ; 
ZonedDateTime zdtEarlier = zdt.minus(d) ; 

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

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

関連する問題