为什么我的日期比较不是真的?

时间:2010-09-02 13:18:54

标签: java

如果以下情况永远不会触发,那么c.after(a)必须始终返回false。但是,如果我取消注释第二个println,我清楚地看到a是> 20050214,正如我所料。

Date a = slice.getCurrentRow().getTime();
Calendar b = Calendar.getInstance();
b.set(2005, 2, 14);
if (b.after(a)) {
System.out.println(dateFormat.format(a));
}
//System.out.println(dateFormat.format(a));

6 个答案:

答案 0 :(得分:10)

您将日期传递给Calendar.after(对象何时)。如果“when”也不是日历,则返回始终为false。在(a)之后尝试b.getTime()。

http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#after(java.lang.Object)

答案 1 :(得分:4)

您正在检查2005-02-14> a,而不是相反。

答案 2 :(得分:2)

如果b(2005年2月14日)之后(2005年2月14日之后),你正在测试。这显然不是真的。你的意思是:

if(a.after(b)) {

???

答案 3 :(得分:2)

Calendar b = Calendar.getInstance();
b.set(2005, 2, 14);

好的,所以你得到一个新的Calendar实例并设置它的年,月和日。快速问题:小时,分钟,秒和毫秒设置为什么?

不知道?我会让GregorianCalendar *的空构造函数的JavaDoc description解释:

  

构造默认GregorianCalendar   使用默认的当前时间   具有默认语言环境的时区。

因此,b有一个你看不到的时间组件。

如果你真的想要一个没有时间的Calendar对象,你需要像这样初始化它:

Calendar b = new GregorianCalendar(2005, Calendar.FEBRUARY, 14, 0, 0, 0);

为什么使用GregorianCalendar构造函数而不是b.set?因为Calendar也有一个毫秒的字段,否则你也必须清除它。实际上,您可以在Calendar实例上手动清除字段,如下所示:

b.set(Calendar.HOUR_OF_DAY, 0);
b.set(Calendar.MINUTE, 0);
b.set(Calendar.SECOND, 0);
b.set(Calendar.MILLISECOND, 0);

如果你要比较它们的相同日期,你可能想要这样做。如果你想测量它是否就在当天凌晨12:00之后,我会使用GregorianCalender构造函数方法。

注意:正如其他人提到的那样,在比较两个日期之前,您仍然需要致电b.getTime()

*GregorianCalendarCalendar

返回的默认Calendar.getInstance()实现

答案 4 :(得分:1)

如果在b.after(a)之后发生b,则

a会返回true。

如果a > 2005-02-14我认为a2005-02-14之后发生

|-------|---------------|-------|
   b=20050214     <     a

正如您在评论中提到的那样,您无法以这种方式将日历与日期进行比较。编译器没有抱怨的原因是因为Calendar.after接受任意Object

解决方案是

b.getTime().after(a)

答案 5 :(得分:1)

您发布的代码会创建一个名为Calendar的新b设置为2005年3月14日,因为Java DateCalendar中的月份为zero-based(1月)是0)。如果您想避免这种情况,请使用Calendar常量(例如Calendar.FEBRUARY)。