2012-12-07 28 views
25

我想比较两个日期,但是我遇到了麻烦。 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。我猜这是因为时间。我如何检查这两个日期是否相等(我的意思是年,月,日相同)?

+0

仅供参考,[乔达时间(HTTP:/ /www.joda.org/joda-time/)项目现在处于[维护模式](https://en.wikipedia.org/wiki/Maintenance_mode),团队建议迁移到[java.time](http ://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary.html)类。请参见[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 –

回答

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

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

toDateMidnight()已弃用,不应使用。可以使用TimeAtStartOfDay(),但它仍然不是最优的,因为它不会删除时区,所以如果两个日期有不同的时区,它们将永远不会相等。 – Stan

+3

我使用'toLocalDate()',我认为它有相同的问题。为了避免这种情况,我猜你可以链接'withZone()',例如:'d.toLocalDate()。isEqual(e.withZone(d.zone).toLocalDate())'。请注意,这是_not_测试。 –

+1

如果d和e是不同的时区,这将不起作用。 Charles Wood上面的答案更可靠 –

1

因为它们是DateTime对象,所以在比较它们时也会考虑它们的时间部分。尝试第一次约会的时间部分设置为0,如:

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

写自己的方法

public boolean checkEqual(DateTime first,DateTime second){ 
    if(first.<getterforyear> == second.<getterforyear> && first.<getterformonth> == second.<getterformonth> && first.<getterforday> == second.<getterforday>){ 
     return true; 
    } 
return false; 
} 
+0

类型相同,仔细阅读问题。两者都是DateTime。 –

+2

这是完全不必要的,因为乔达时间有许多实用方法可以完成这种事情。 –

3

如果你想忽略时间部分(即你只想比较日期),你可以使用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日期和所有乔达,时间转眼类(DateTime和包括DateMidnight)是使用默认时区构建的。因此,如果您在代码中创建一个日期进行比较,但是从DB中检索另一个可能存储UTC日期的日期,则可能会遇到不一致情况,前提是您不在UTC时区。

+0

DateMidnight in package time is deprecated建议使用localDate –

+0

所有与午夜有关的类和方法和方法都被弃用,取而代之的是“一刻的第一时间”的概念和方法。 –

15

您应该使用toLocalDate()

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

这将摆脱日期时间的时间部分。

还有一个办法,但它不占地方两个日期有不同的时区的情况下,所以它不太可靠:

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()) 
0

这是一个静态方法,这对我很有用。

public static boolean isSameDay(DateTime date1, DateTime date2){ 
    return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()); 
} 
+0

我使用'toLocalDate'看不到[现有答案](https://stackoverflow.com/a/21553438/642706)的优点。如果'DateTime'对象具有不同的时区,而另一个应答的方法则不会。这是好还是坏取决于业务问题。 –

-1
DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2); 

OBJ1和OBJ2可以是一个字符串,龙,日期(java.util中)...详情请参见 http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html

+1

欢迎来到Stack Overflow!在回答问题之前,请阅读现有答案。这个答案已经提供。不要重复答案,而应当回答现有的答案。一些编写好答案的指导可以在这里找到(https://stackoverflow.com/help/how-to-answer)。 – dferenc