如何比较 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.equalsLocalDate.isEqual 有何不同?您的回答可能需要更多解释。 @Lii 你可以查看我更新的答案。我删除了以前的编辑并添加了更多信息 "所有这些方法都使用compareTo0() 方法。"那很有意思!这是否意味着equalsisEqualcompareTo(other) == 0 是等价的?文档有点不清楚。 equalsisEquals 都使用 return compareTo0((LocalDate) obj) == 0; 所以是的。区别在于等于第一次检查instanceOfisEqual 是强类型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 的使用就会有问题。 方法toDateTimeAtCurrentTimeLocalDate类中不存在。【参考方案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 类的对象?

如何将 LocalDate 转换为 SQL Date Java?

Java经典实例:把字符串解析为日期时间

java 8中新的日期和时间API

如何在文本字段中格式化 java.time.LocalDate? [复制]