web-dev-qa-db-ja.com

Calendar.compareTo()を使用して日付を比較する必要がありますか?

日付を比較する有効な方法ですか?

Calendar someCalendar1 = Calendar.getInstance(); // current date/time
someCalendar1.add(Calendar.DATE, -14);

Calendar someCalendar2 = Calendar.getInstance();
someCalendar2.setTime(someDate); // someDate is in the format of MM/dd/yyyy

if(someCalendar2.compareTo(someCalendar1) < 0){
   ...Code...               
}

...またはより良いアプローチはありますか?

16
Milli

Date は比較可能なものを実装しているため、カレンダーにラップする理由はありません。

Calendar someCalendar1 = Calendar.getInstance(); // current date/time
someCalendar1.add(Calendar.DATE, -14);

if (someDate.compareTo(someCalendar1.getTime()) < 0) {
   ...Code...                           
}

日付には、上記の比較を読みやすくする便利な after() および before() メソッドもあります。

if (someDate.before(someCalendar1.getTime())) {
   ...Code...                           
}

最後に、日付/時刻を頻繁に処理する場合は、組み込みのJavaクラスの代わりに Joda Time を使用することを検討してください。はるかに便利で機能的です。

DateTime dt = new DateTime().minusWeeks(2);
if (new DateTime(someDate).isBefore(dt)) {
   ...Code...                           
}
20
ChssPly76

有効ですが、someDateについて少し混乱しています-Calendar.setTimeJava.util.Dateを取ります。これは、真夜中からのミリ秒数を示すlongのラッパーです。 1970年1月1日、UTC。 「MM/dd/yyyの形式」ではありません。これは、Java.util.Dateではなく、文字列表現です。 MM/dd/yyyyの形式で何かが出力された場合、それはDate.toStringがあなたのために行っていることです-それは本質的に形式の一部ではありません。

余談ですが、個人的にはJava.util.DateJava.util.Calendarを完全に避け、代わりに Joda Time を使用することをお勧めします。 ずっと良いAPIです。

7
Jon Skeet

チェックアウト Apache DateUtils

2
Nico

Jodaが優れている理由の1つの例として、夏時間を考えてみてください。

「1日」を1000 * 60 * 60 * 24ミリ秒として測定している場合、日付ライブラリとカレンダーライブラリはどちらも、1年に25時間の日と23時間の日があることを忘れます。 J2SE APIに組み込まれているJavaクラスのみに依存している場合は、最新の計算。

Jodaは、Javaの将来のバージョンでは、GregorianCalendar、Calendar、およびDateのドロップイン代替になる可能性が半分になります。

2
Dean J

今は古い質問です。今日と明日の読者に役立つためには、現代的な答えが必要です。それが私がここで提供しているものです。

Java.time

    LocalDate someDate1 = LocalDate.now(ZoneId.of("Africa/Lusaka"))
            .minusDays(14);
    LocalDate someDate2 = LocalDate.of(2019, Month.OCTOBER, 11);

    if (someDate2.isBefore(someDate1)) {
        System.out.println("" + someDate2 + " is before " + someDate1);
    }

今日このコードを実行したときの出力は次のとおりです。

2019-10-11は2019-10-13より前

2009年にCalendarを使用することは有効でしたが、クラスは常に設計が不十分であり、現在は古くなっています。私は確かにもう誰もそれを使わないことを勧めます。代わりに、最新のJava日付と時刻のAPIであるJava.timeを使用してください。

リンク:Oracleチュートリアル:日時 Java.timeの使用方法の説明。

1
Ole V.V.

大丈夫です。また、before()およびafter()を使用できます。

package demo.so;

import Java.util.Date;
import Java.text.DateFormat;
import Java.text.SimpleDateFormat;
import Java.util.Calendar;

public class Tester {

    public static void main(String[] args) throws Exception {

    Calendar someCalendar1 = Calendar.getInstance(); // current date/time
    someCalendar1.add(Calendar.DATE, -11);

    DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
    Date someDate =   df.parse("10/08/2009");

    Calendar someCalendar2 = Calendar.getInstance();
    someCalendar2.setTime(someDate);

    String cal1 = df.format(someCalendar1.getTime());
    String cal2 = df.format(someCalendar2.getTime());

    if (someCalendar1.equals(someCalendar2))
        System.out.println( cal1 + " is the same as " + cal2);
    if (someCalendar1.after(someCalendar2))
        System.out.println(cal1 + " is after " + cal2);
    if (someCalendar1.before(someCalendar2))
        System.out.println(cal1 + " is before " + cal2);

    }

}

ただし、Dateは使用しないでください。非推奨であり、日付の処理に関する問題の原因となります。 GregorianCalendarの独自のラッパーを作成するか、Jodaなどの優れたライブラリーを使用します。

0
JuanZe