我应该使用Calendar.compareTo()比较的日期?(Should I use Calen

2019-08-17 03:36发布

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

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

...或者是有没有更好的方法吗?

Answer 1:

日期实现可比本身,因此没有理由将它包装成日历:

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

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

日期也有方便后()和()之前 ,使上面的对比更容易阅读的方法:

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

最后,如果你使用的日期/时间处理了很多,也可以考虑使用约达时间 ,而不是内置的Java类。 它更方便,功能:

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


Answer 2:

它是有效的,但你稍微困惑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完全和使用约达时间代替。 这是一个更好的 API。



Answer 3:

结账阿帕奇DateUtils



Answer 4:

至于为什么乔达是更好的一个例子,拿夏令时。

如果你测量“一天”为1000 * 60 * 60 * 24毫秒,日期库 - 和日历库 - 既忘了有一天在今年25个小时,而另一个与23你会偶尔螺丝高达日期计算,如果你仅仅依靠内建在J2SE API的Java类。

乔达是成功的一半可能是直接替代GregorianCalendar的,日历和日期在Java中的未来版本。



Answer 5:

没关系。 您也可以前()和()后使用:

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);

    }

}

但是,你不应该使用日期,已被废弃,烦恼的日期处理的来源。 建立自己的包装GregorianCalendar的,或使用一些好的库,如乔达。



文章来源: Should I use Calendar.compareTo() to compare dates?