如果以下情况永远不会触发,那么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));
答案 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()
。
*GregorianCalendar
是Calendar
Calendar.getInstance()
实现
答案 4 :(得分:1)
b.after(a)
之后发生b
,则 a
会返回true。
如果a > 2005-02-14
我认为a
在 2005-02-14
之后发生。
|-------|---------------|-------|
b=20050214 < a
正如您在评论中提到的那样,您无法以这种方式将日历与日期进行比较。编译器没有抱怨的原因是因为Calendar.after接受任意Object
。
解决方案是
b.getTime().after(a)
答案 5 :(得分:1)
您发布的代码会创建一个名为Calendar
的新b
设置为2005年3月14日,因为Java Date
和Calendar
中的月份为zero-based(1月)是0)。如果您想避免这种情况,请使用Calendar
常量(例如Calendar.FEBRUARY
)。