使用Joda时间比较两个日期

我想比较两个日期,但是我遇到了麻烦。 1日期是从java.util.date对象创建的,另一个是手动制作的。 以下代码是一个示例:

 Date ds = new Date(); DateTime d = new DateTime(ds); DateTime e = new DateTime(2012,12,07, 0, 0); System.out.println(d.isEqual(e)); 

然而,测试结果是false 。 我猜这是因为时间。 如何检查这两个日期是否相等(我的意思是年,月,日期是相同的)?

 System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight())); 

要么

 System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay())); 

你应该使用toLocalDate()

 date1.toLocalDate().isEqual(date2.toLocalDate()) 

这将摆脱DateTime的Time部分。

还有另一种方法,但它没有考虑两个日期具有不同时区的情况,因此它不太可靠:

 date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()) 
 return DateTimeComparator.getDateOnlyInstance().compare(first, second); 

通过如何在没有时间部分的情况下比较两个日期?

如果要忽略时间组件(即只想比较日期),可以使用DateMidnight类而不是Date Time。 所以你的例子看起来像这样:

 Date ds = new Date(); DateMidnight d = new DateMidnight(ds); DateMidnight e = new DateMidnight(2012, 12, 7); System.out.println(d.isEqual(e)); 

但要注意,它只会在今天打印“真实”:)

另请注意,默认情况下,JDK Date和所有Joda-Time即时类(包括DateTime和DateMidnight)都是使用默认时区构造的。 因此,如果您在代码中创建一个日期进行比较,但是从数据库中检索另一个可能以UTC格式存储日期的日期,则可能会遇到不一致,假设您不在UTC时区。

因为它们是DateTime对象,所以当您比较它们时,它们的时间部分也会被考虑在内。 尝试将第一个日期的时间部分设置为0,如:

 d = d.withTime(0, 0, 0, 0); 

我在寻找与今天的比较时偶然发现了这个问题。 以下是将日期与今天进行比较的方法:

 date1.toLocalDate().isBeforeNow() // works also with isAfterNow 

这是一个适合我的静态方法。

 public static boolean isSameDay(DateTime date1, DateTime date2){ return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()); } 
 DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2); 

obj1和obj2可以是String,Long,Date(java.util)……有关详细信息,请参阅http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator html的

编写自己的方法

 public boolean checkEqual(DateTime first,DateTime second){ if(first. == second. && first. == second. && first. == second.){ return true; } return false; }