[英]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...
}
作为 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.