我不明白 LocalDate#compareTo() Java 方法 return 值
I don't understand LocalDate#compareTo() Java method return value
我正在尝试通过 Java 和 LocalDate class 来熟练掌握日期,但是我对 compareTo 方法 return 的值有些不了解.
我认为我正在使用的 nextDate.compareTo(previousDate)
会 return:
- 0 当日期相同时
- > 0 当参数在调用方法的日期之前
- < 0 当参数在调用方法的日期之后
但我认为可以肯定地说 >0 return 值和 <0 值是以天为单位的时间跨度,等于 nextDate - previousDate。
例如(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是怎么回事吗?
猜测,这里发生的事情是 returning:
- 年份不同则年份不同;
- 年份相同但月份不同时的月份差;
- 如果年和月相等,则天数相差。
然而,这并不重要:关于 return 值,您唯一应该考虑的是 它的符号 :
- 负数表示
a < b
;
- 零表示
a == b
;
- 正数表示
a > b
.
确切的值本身(零除外)完全无关紧要,如果内部实现发生变化,则可能会发生变化。您应该只将 compareTo
(或 compare
)的结果与零进行比较,例如result < 0, result >= 0
等
在 LocalDate
(以及其他 java.time
类)的特定情况下,提供了使检查意图更加明显的方法:
a.isBefore(b)
对应a.compareTo(b) < 0
;
a.isAfter(b)
对应a.compareTo(b) > 0
.
选择哪种取决于您(或您的团队风格)。
我正在尝试通过 Java 和 LocalDate class 来熟练掌握日期,但是我对 compareTo 方法 return 的值有些不了解.
我认为我正在使用的 nextDate.compareTo(previousDate)
会 return:
- 0 当日期相同时
- > 0 当参数在调用方法的日期之前
- < 0 当参数在调用方法的日期之后
但我认为可以肯定地说 >0 return 值和 <0 值是以天为单位的时间跨度,等于 nextDate - previousDate。
例如(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是怎么回事吗?
猜测,这里发生的事情是 returning:
- 年份不同则年份不同;
- 年份相同但月份不同时的月份差;
- 如果年和月相等,则天数相差。
然而,这并不重要:关于 return 值,您唯一应该考虑的是 它的符号 :
- 负数表示
a < b
; - 零表示
a == b
; - 正数表示
a > b
.
确切的值本身(零除外)完全无关紧要,如果内部实现发生变化,则可能会发生变化。您应该只将 compareTo
(或 compare
)的结果与零进行比较,例如result < 0, result >= 0
等
在 LocalDate
(以及其他 java.time
类)的特定情况下,提供了使检查意图更加明显的方法:
a.isBefore(b)
对应a.compareTo(b) < 0
;a.isAfter(b)
对应a.compareTo(b) > 0
.
选择哪种取决于您(或您的团队风格)。