我应该使用Calendar.compareTo()来比较日期吗?

时间:2009-10-01 18:01:17

标签: java date calendar

这是比较日期的有效方式:

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...               
}

...还是有更好的方法?

6 个答案:

答案 0 :(得分:19)

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...                           
}

最后,如果你正在处理很多日期/时间,请考虑使用Joda Time而不是内置的java类。它更方便,更实用:

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

答案 1 :(得分:7)

这是有效的,但您对someDate稍微感到困惑 - Calendar.setTime需要java.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。

答案 2 :(得分:2)

答案 3 :(得分:2)

作为Joda为何更好的一个例子,请采取夏令时。

如果您将“一天”测量为1000 * 60 * 60 * 24毫秒,则日期库 - 以及日历库 - 都会忘记一年中有一天有25小时,另一天有23天。如果仅依赖于J2SE API中内置的Java类,有时会搞砸日期计算。

在未来的Java版本中,Joda很可能成为GregorianCalendar,Calendar和Date的替代品。

答案 4 :(得分:1)

这是一个古老的问题。为了对今天和明天的读者有所帮助,它需要一个现代的答案。这就是我在这里提供的。

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 tutorial: Date Time解释了如何使用java.time。

答案 5 :(得分:0)

没关系。您也可以使用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。