【问题标题】:I don't understand LocalDate#compareTo() Java method return value我不明白 LocalDate#compareTo() Java 方法返回值
【发布时间】:2022-02-04 11:40:13
【问题描述】:

我正在尝试通过 Java 和 LocalDate 类来熟练掌握日期,不过,对于 compareTo 方法的返回值,我有些不明白。

我认为我正在使用的 nextDate.compareTo(previousDate) 会返回:

  • 0 当日期相同时
  • > 当参数早于调用方法的日期时为 0

但我认为可以肯定地说 >0 返回值和

例如(yyyy-MM-dd):

  • 2030/01/31 - 2030/01/01 = 30
  • 2030/01/03 - 2030/01/01 = 2
  • 2030/02/03 - 2030/01/31 = 3

根据以下测试,这并不总是正确的,我不明白为什么。

package com.mycompany.provalocaldatenuovo;

import java.time.LocalDate;

public class UI {

    public static void main(String args[]) {

        // Test 1
        LocalDate previousDate1 = LocalDate.of(2030, 01, 01);
        LocalDate nextDate1 = LocalDate.of(2030, 01, 31);

        // Test 2
        LocalDate previousDate2 = LocalDate.of(2030, 01, 01);
        LocalDate nextDate2 = LocalDate.of(2030, 01, 03);

        // Test 3
        LocalDate previousDate3 = LocalDate.of(2030, 01, 31);
        LocalDate nextDate3 = LocalDate.of(2030, 02, 03);

        // Test 4
        LocalDate previousDate4 = LocalDate.of(2030, 1, 31);
        LocalDate nextDate4 = LocalDate.of(2030, 1, 31);

        // Test 1 - expected 30
        System.out.println("TEST 1: " + nextDate1.compareTo(previousDate1));

        // Test 2 - expected 2
        System.out.println("TEST 2: " + nextDate2.compareTo(previousDate2));

        // Test 3 - expected 3
        System.out.println("TEST 3: " + nextDate3.compareTo(previousDate3));

        // Test 4 - expected 0
        System.out.println("TEST 4: " + nextDate4.compareTo(previousDate4));
    }
}

输出:

TEST 1: 30
TEST 2: 2
TEST 3: 1    //??? doesn't matter which day on february is, this will result 1
TEST 4: 0

你知道 TEST3 发生了什么吗?

【问题讨论】:

  • 返回值本身是完全不相关的,除了它是否等于、大于或小于零。
  • “但我认为可以肯定地说......”不,不是。
  • 安迪是对的。如果要获取两个LocalDate 实例之间的天数,请使用firstDate.until(secondDate)Period.between(firstDate, secondDate)
  • 您的 Localdate.compareTo() 正在比较并返回它得到的第一个差异。如果您更改年份,您将获得年份的差异。如果您保持年份不变并更改月份,您将得到月份的差异(这就是测试 3 中发生的情况)。如果您在两个日期中保持年份和月份相同,则日期将相同。
  • @RobSpoor 谢谢你的提示:这实际上解决了我在一个更大的应用程序中的问题

标签: java compareto localdate


【解决方案1】:

猜测,这里发生的事情是它正在返回:

  • 如果年份不同,年份的差异;
  • 年份相同但月份不同时的月份差异;
  • 年月相等时的天数差。

然而,这并不是很重要:关于返回值,您唯一应该考虑的是它的符号

  • 负数表示a < b
  • 零表示a == b
  • 正数表示a > b

确切的值本身(除了零)是完全不相关的,如果内部实现发生变化,可能会发生变化。您应该只将compareTo(或compare)的结果与零进行比较,例如result < 0, result >= 0


LocalDate(和其他java.time类)的特定情况下,提供了一些方法来使检查的意图更加明显:

这取决于你(或你的团队风格)喜欢哪个。

【讨论】:

  • 我很确定这正是正在发生的事情。谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2018-10-16
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多