Java 按日期比较DateTime对象

Java 按日期比较DateTime对象,java,datetime,jodatime,Java,Datetime,Jodatime,我希望有人能帮助我,知道乔达时间相当好。代码如下: DateTimeComparator comparator = DateTimeComparator.getInstance( DateTimeFieldType.dayOfMonth(), DateTimeFieldType.year()); java.sql.Date beforeDate = new java.sql.Date(1372910400000L); // July 4 2013 java.sql.Date nowD

我希望有人能帮助我,知道乔达时间相当好。代码如下:

DateTimeComparator comparator = DateTimeComparator.getInstance(
    DateTimeFieldType.dayOfMonth(), DateTimeFieldType.year());

java.sql.Date beforeDate = new java.sql.Date(1372910400000L);  // July 4 2013
java.sql.Date nowDate = new java.sql.Date(System.currentTimeMillis());
DateTime beforeDateTime = new DateTime(beforeDate);
DateTime nowDateTime = new DateTime(nowDate);

int result = comparator.compare(nowDateTime, beforeDateTime);
System.out.println(nowDate+" compared to "+beforeDate+" = "+result);
从Javadocs API进行比较:

返回: 如果顺序不重要,则为零;如果lhsObj
我做错了什么

看起来您从比较中排除了年份,这使得2015年3月小于2004年7月。
getInstance(DateTimeFieldType下限,DateTimeFieldType上限)

返回具有下限和上限的DateTimeComparator。场 小于下限的震级不包括在比较范围内。 震级大于或等于上限的场为 也被排除在比较之外。任一限制都可以指定为null, 这表示一个无限的限制


给定当前代码示例,您希望传递
null
作为
DateTimeComparator
的上限,以便按日期正确比较
DateTime
对象:

DateTimeComparator.getInstance(DateTimeFieldType.dayOfMonth(), null);
这意味着“在月日的基础上比较
DateTime
对象,以及比这更广泛的所有内容,将时间等更精确的字段视为相等”


但事实上,这根本不是你想对JodaTime做的。JodaTime为不同的操作提供了许多不同的日期和时间类,如果您的目标是比较日期,则需要使用。它的
.compareTo()
工作原理完全符合您的预期:

new LocalDate().compareTo(new LocalDate(2013,7,4)) // returns 1
请注意,
java.sql.Date
只存储日期信息,而不存储时间或时区信息。通过构造一个
DateTime
对象,可以人为地将时间和时区与日期关联起来
java.sql.Date
在Joda时间内的正确同级是
LocalDate

当您关心日期时,请使用
LocalDate
;当您关心时间时,请使用;当您关心给定日期的时间时,请使用。这些类的共同点是它们代表了我们对时间的抽象概念,而不是历史上的瞬间。这可能看起来很奇怪,但这往往是你真正想要的。文档中的关键概念对此进行了详细介绍


只有当您确实需要实时讨论实例时,才应该使用
DateTime
及其相关类。这实际上并不像您想象的那样常见于日期/时间密集型代码。从
Local*
类开始,看看它们是否能满足您的用例。

这就解释了。谢谢
new LocalDate().compareTo(new LocalDate(2013,7,4)) // returns 1