compareTo方法示例
以下是 Java LocalDate.compareTo()
的用法示例
1. 基础用法:日期比较逻辑
import java.time.LocalDate;
public class DateComparison {
public static void main(String[] args) {
LocalDate today = LocalDate.of(2025, 3, 31);
LocalDate approvalDate = LocalDate.of(2025, 3, 30);
LocalDate sameDate = LocalDate.of(2025, 3, 31);
// 1. 等于 0(当前日期 == 目标日期)
int equalResult = sameDate.compareTo(today); // 0
boolean isEqual = equalResult == 0; // true
// 2. 大于等于 0(当前日期 >= 目标日期)
int gteResult = today.compareTo(approvalDate); // 1(>0)
int gteEqualResult = today.compareTo(sameDate); // 0
boolean isGte = gteResult >= 0; // true(today >= approvalDate)
// 3. 小于等于 0(当前日期 <= 目标日期)
int lteResult = approvalDate.compareTo(today); // -1(<0)
int lteEqualResult = sameDate.compareTo(today); // 0
boolean isLte = lteResult <= 0; // true(approvalDate <= today)
}
}
2. 结合业务场景的等价写法
业务需求 | compareTo 写法 | 语义化方法(更推荐) | 说明 | ||
---|---|---|---|---|---|
当前日期 > 审批日期 | date.compareTo(approval) > 0 | date.isAfter(approval) | 严格晚于(如截止日不包含当天) | ||
当前日期 ≥ 审批日期 | date.compareTo(approval) >= 0 | `date.isAfter(approval) | date.equals(approval)<br>(Java 11+ 可用 isAfterOrEqual`) | 包含当天(如生效日含审批日) | |
当前日期 < 审批日期 | date.compareTo(approval) < 0 | date.isBefore(approval) | 严格早于 | ||
当前日期 ≤ 审批日期 | date.compareTo(approval) <= 0 | `date.isBefore(approval) | date.equals(approval)<br>(Java 11+ 可用 isBeforeOrEqual`) | 包含当天 | |
日期相等 | date.compareTo(target) == 0 | date.equals(target) | 直接判断相等 |
3. 防御性编程示例(含空值校验)
public boolean isEffectiveDateValid(LocalDate effectiveDate, String approvalDateStr) {
if (effectiveDate == null) {
throw new IllegalArgumentException("生效日期不可为空");
}
LocalDate approvalDate = string2LocalDate(approvalDateStr); // 假设转换方法已处理空/非法格式
if (approvalDate == null) {
return false; // 或根据业务抛出异常
}
// 业务逻辑:生效日期必须 ≥ 审批日期(包含当天)
return effectiveDate.compareTo(approvalDate) >= 0;
// 等价语义化写法(推荐):
// return effectiveDate.isAfter(approvalDate) || effectiveDate.equals(approvalDate);
}
4. Java 11+ 增强方法(更简洁)
LocalDate today = LocalDate.now();
LocalDate yesterday = today.minusDays(1);
// 大于等于(含等于)
boolean isGteJava11 = today.isAfterOrEqual(yesterday); // true(today > yesterday)
boolean isGteEqualJava11 = today.isAfterOrEqual(today); // true(等于)
// 小于等于(含等于)
boolean isLteJava11 = yesterday.isBeforeOrEqual(today); // true(yesterday < today)
boolean isLteEqualJava11 = today.isBeforeOrEqual(today); // true(等于)
🚨 注意事项
- 空值风险:始终先校验日期是否为
null
,避免NullPointerException
。 - 时间精度:
LocalDate
仅含日期,若需时间精度,改用LocalDateTime
并统一时间(如默认 00:00:00)。 - 可读性优先:能用
isAfter
/isBefore
时,避免直接用compareTo
(减少 “魔数”>0
/>=0
等)。 - 业务对齐:明确是否包含 “等于” 场景(如审批日是否是生效起点),通过注释或方法名清晰表达(如
isEffectiveDateNotEarlierThanApproval
)。
总结
- 等于 0:用
date.equals(target)
或compareTo == 0
- 大于等于:
compareTo >= 0
→ 推荐isAfterOrEqual
(Java 11+)或手动组合 - 小于等于:
compareTo <= 0
→ 推荐isBeforeOrEqual
(Java 11+)或手动组合
优先选择语义化方法,代码可读性远高于compareTo
的数值判断。