繁体   English   中英

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

[英]Should I use Calendar.compareTo() to compare dates?

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

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

……或者有更好的方法吗?

Date实现了可比本身,因此没有理由将其包装到日历中:

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

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

Date 也有方便的after()before()方法,使上面的比较更容易阅读:

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

最后,如果您经常处理日期/时间,请考虑使用Joda Time而不是内置的 Java 类。 它更加方便和实用:

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

它是有效的,但你稍稍感到困惑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。

作为 Joda 更好的一个例子,以夏令时为例。

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

在 Java 的未来版本中,Joda 有一半可能是 GregorianCalendar、Calendar 和 Date 的直接替代品。

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

时间

    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.time,现代 Java 日期和时间 API。

链接: Oracle 教程:解释如何使用 java.time 的日期时间

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM