如何比较 LocalDate 实例 Java 8
Posted
技术标签:
【中文标题】如何比较 LocalDate 实例 Java 8【英文标题】:How to compare LocalDate instances Java 8 【发布时间】:2015-05-25 21:40:33 【问题描述】:我正在编写一个需要非常准确的日期的应用程序,我想知道如何比较 LocalDate 实例。现在我正在使用类似的东西:
LocalDate localdate1 = LocalDate().now();
LocalDate localdate2 = someService.getSomeDate();
localdate1.equals(localdate2);
但我注意到我的应用程序给了我一些令人困惑的结果,我认为这是因为日期比较。
我正在考虑获取 1970 年以来的时间并比较这两者,但我必须更容易,我很确定
【问题讨论】:
什么样的结果令人困惑?equals
的 dox 说 "Compares ... 确保日期相同" 。在你的情况下,这听起来是正确的。
这是我的错误,问题的根源在于另一个问题,但是我仍然很好奇这是否是比较 LocalDates 的适当方式:)
至于您使用 1970 年的计数的想法,请避免这样做。它令人困惑且难以调试。现代 java.time 类消除了对这种尴尬处理的任何需要。
【参考方案1】:
使用equals()
LocalDate
确实覆盖等于:
int compareTo0(LocalDate otherDate)
int cmp = (year - otherDate.year);
if (cmp == 0)
cmp = (month - otherDate.month);
if (cmp == 0)
cmp = (day - otherDate.day);
return cmp;
如果您对equals()
的结果不满意,您可以使用LocalDate
的预定义方法。
isAfter()
isBefore()
isEqual()
请注意,所有这些方法都使用compareTo0()
方法,只需检查cmp
值。如果你仍然得到奇怪的结果(你不应该),请附上输入和输出的例子
【讨论】:
"会给比较对象" 我觉得这很难理解,你这是什么意思?LocalData.equals
与 LocalDate.isEqual
有何不同?您的回答可能需要更多解释。
@Lii 你可以查看我更新的答案。我删除了以前的编辑并添加了更多信息
"所有这些方法都使用compareTo0()
方法。"那很有意思!这是否意味着equals
、isEqual
和compareTo(other) == 0
是等价的?文档有点不清楚。
equals
和 isEquals
都使用 return compareTo0((LocalDate) obj) == 0;
所以是的。区别在于等于第一次检查instanceOf
而isEqual
是强类型ChronoLocalDate
@Lii @royB 我只想声明 equals()
接受 Object
并且如果您传递任何不是 LocalDate
实例的内容,则将返回 false。【参考方案2】:
我相信这个 sn-p 在日期比较跨越两个以上条目的情况下也会有所帮助。
static final int COMPARE_EARLIEST = 0;
static final int COMPARE_MOST_RECENT = 1;
public LocalDate getTargetDate(List<LocalDate> datesList, int comparatorType)
LocalDate refDate = null;
switch(comparatorType)
case COMPARE_EARLIEST:
//returns the most earliest of the date entries
refDate = (LocalDate) datesList.stream().min(Comparator.comparing(item ->
item.toDateTimeAtCurrentTime())).get();
break;
case COMPARE_MOST_RECENT:
//returns the most recent of the date entries
refDate = (LocalDate) datesList.stream().max(Comparator.comparing(item ->
item.toDateTimeAtCurrentTime())).get();
break;
return refDate;
【讨论】:
@Chan Tan:感谢您的编辑,需要一些时间来适应内容编辑器的格式.. 这段代码很脆弱。我不建议使用它。特别是,如果它恰好在本地日期从一天转换到下一天时运行,那么toDateTimeAtCurrentTime
的使用就会有问题。
方法toDateTimeAtCurrentTime
在LocalDate
类中不存在。【参考方案3】:
LocalDate ld ....;
LocalDateTime ldtime ...;
ld.isEqual(LocalDate.from(ldtime));
【讨论】:
欢迎来到 Stack Overflow!即使这可以回答问题,也没有对您的代码的解释。请更新您的答案以解释您在做什么。谢谢!以上是关于如何比较 LocalDate 实例 Java 8的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Boot 2 和 Kotlin 进行 Jackson 反序列化,无法构造 `java.time.LocalDate` 的实例
如何比较 LocalDate 和 Calendar 类的对象?