当前位置: 首页 > news >正文

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) > 0date.isAfter(approval)严格晚于(如截止日不包含当天)
当前日期 ≥ 审批日期date.compareTo(approval) >= 0`date.isAfter(approval)date.equals(approval)<br>(Java 11+ 可用 isAfterOrEqual`)包含当天(如生效日含审批日)
当前日期 < 审批日期date.compareTo(approval) < 0date.isBefore(approval)严格早于
当前日期 ≤ 审批日期date.compareTo(approval) <= 0`date.isBefore(approval)date.equals(approval)<br>(Java 11+ 可用 isBeforeOrEqual`)包含当天
日期相等date.compareTo(target) == 0date.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(等于)

🚨 注意事项

  1. 空值风险:始终先校验日期是否为 null,避免 NullPointerException
  2. 时间精度LocalDate 仅含日期,若需时间精度,改用 LocalDateTime 并统一时间(如默认 00:00:00)。
  3. 可读性优先:能用 isAfter/isBefore 时,避免直接用 compareTo(减少 “魔数”>0/>=0 等)。
  4. 业务对齐:明确是否包含 “等于” 场景(如审批日是否是生效起点),通过注释或方法名清晰表达(如 isEffectiveDateNotEarlierThanApproval)。

总结

  • 等于 0:用 date.equals(target) 或 compareTo == 0
  • 大于等于compareTo >= 0 → 推荐 isAfterOrEqual(Java 11+)或手动组合
  • 小于等于compareTo <= 0 → 推荐 isBeforeOrEqual(Java 11+)或手动组合
    优先选择语义化方法,代码可读性远高于 compareTo 的数值判断。

相关文章:

  • git分支和标签
  • ①EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • K8s存储全解析:从临时存储到持久化解决方案的完整指南
  • 探索量子世界的先驱:马克斯・普朗克与普朗克参数
  • 【区块链安全 | 第十七篇】类型之引用类型(一)
  • 数据结构:树的5种存储方案详解(C语言完整实现)
  • 计算机网络 TCP/IP参考模型
  • C++底层学习精进:模板进阶
  • StatefulSet
  • 【算法】将一个数组旋转K步
  • vue 自定义指令
  • Ollama实战指南:本地大模型一键部署与高效使用(2024最新版)
  • 【一起来学kubernetes】30、k8s的java sdk怎么用
  • VLA 论文精读(三)Diffusion Policy: Visuomotor Policy Learning via Action Diffusion
  • sql注入学习
  • 可信数据空间:构筑安全可控数据流通
  • 强制用户裸奔,微软封锁唯一后门操作
  • 使用docker容器搭建本地yum源并及时更新
  • 循环控制的内容
  • [Vue]生命周期
  • 网页设计发展前景分析/教程seo推广排名网站
  • 公司备案的网站被别的公司盗用/百度搜索排名机制
  • 局域网聊天工具免费版/seo建站公司
  • 商务网站建设与维护考试/推广方式都有哪些
  • p2p 金融网站开发/百度提交网站
  • 乐亭网站建设/雅思培训机构哪家好机构排名