这是比较日期的有效方式:
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...
}
...还是有更好的方法?
答案 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.Date
和java.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)
这是一个古老的问题。为了对今天和明天的读者有所帮助,它需要一个现代的答案。这就是我在这里提供的。
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。