在 Java 开发中,日期的比较、计算是高频场景。传统的 DateCalendar 类存在线程不安全、API 繁琐等问题,Java 8 引入的 java.time 日期时间 API 彻底解决了这些痛点,它线程安全、设计简洁、语义清晰,是处理日期的最佳选择。

本文将通过一个日期比较 + 间隔天数计算的实战案例,带你掌握 java.time 核心类 LocalDate 的用法,完美解决日期比较、天数计算需求。

一、需求分析

  1. 接收用户输入的两个日期(支持 -///. 分隔,如 2025-01-01
  2. 创建两个日期对象
  3. 计算两个日期相隔的天数
  4. 判断后一个日期是否在前一个日期之后
  5. 输出结果

二、核心知识点:java.time.LocalDate

LocalDatejava.time 包下的本地日期类,仅表示年月日,不包含时间和时区,是处理日期的核心类:

  1. 不可变类:线程安全,修改日期会返回新对象
  2. 静态方法 of():快速创建日期对象
  3. 比较方法isAfter()isBefore()equals() 直接判断日期先后
  4. 天数计算:结合 ChronoUnit.DAYS 计算两个日期的间隔天数

三、完整代码实现

我们基于程序模板,补全核心代码,实现完整功能:

//CompareDate.java
import java.time.*;
import java.util.Scanner;
import java.time.temporal.ChronoUnit;

public class CompareDate {
    public static void main(String args[ ]) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入开始的年,月,日 ");
        System.out.println("年月日之间用-,/或.分隔\n 例如:2018-2-12");
        
        String regex = "[-./]";
        // 分割用户输入的日期字符串
        String [] input = scanner.nextLine().split(regex);
        int year = Integer.parseInt(input[0]);
        int month = Integer.parseInt(input[1]);
        int day = Integer.parseInt(input[2]);
        
        LocalDate dateStart = null;
        // 代码1:创建开始日期对象
        dateStart = LocalDate.of(year, month, day);
        
        System.out.print("输入结束的年,月,日:");
        input = scanner.nextLine().split(regex);
        year = Integer.parseInt(input[0]);
        month = Integer.parseInt(input[1]);
        day = Integer.parseInt(input[2]);
        
        LocalDate dateEnd = null;
        // 代码2:创建结束日期对象
        dateEnd = LocalDate.of(year, month, day);
        
        // 代码3:计算两个日期相隔的天数
        long days = ChronoUnit.DAYS.between(dateStart, dateEnd);
        
        // 代码4:判断dateEnd是否在dateStart之后
        boolean boo = dateEnd.isAfter(dateStart);
        
        if(boo)
            System.out.println(dateEnd+"在"+dateStart+"之后");
        System.out.println(dateStart+"和"+dateEnd+"相隔:");
        System.out.println(Math.abs(days)+"天(不足一天的零头按 0 计算)");
        
        scanner.close();
    }
}

核心代码解析

  1. 代码 1 / 代码 2:创建 LocalDate 对象 LocalDate.of(年, 月, 日) 是静态工厂方法,直接传入 int 类型的年、月、日,返回不可变的 LocalDate 对象,替代了传统 Calendar 的繁琐赋值。

  2. 代码 3:计算间隔天数 ChronoUnit.DAYS.between(起始日期, 结束日期)

    • 精确计算两个日期的天数差
    • 若结束日期在起始日期之前,返回负数
    • 配合 Math.abs() 可以获取绝对值天数
  3. 代码 4:日期先后判断 dateEnd.isAfter(dateStart):直接判断 dateEnd 是否在 dateStart 之后,返回布尔值; 同理:

    • isBefore():判断是否在日期之前
    • equals():判断两个日期是否相等

四、运行效果演示

输入示例:

输入开始的年,月,日 
年月日之间用-,/或.分隔
 例如:2018-2-12
2025-01-01
输入结束的年,月,日:2025/01/10
2025-01-10在2025-01-01之后
2025-01-01和2025-01-10相隔:
9天(不足一天的零头按 0 计算)

五、知识点拓展

1. 为什么推荐 java.time 而非传统日期类

特性 传统 Date/Calendar java.time (LocalDate)
线程安全 非安全,易引发 bug 安全(不可变类)
API 简洁性 繁琐,易出错 语义化,一行代码完成
日期计算 手动计算,易出错 工具类直接调用

2. 常用 LocalDate 方法

// 获取当前日期
LocalDate now = LocalDate.now();
// 判断日期是否在之前
boolean isBefore = dateEnd.isBefore(dateStart);
// 日期加减天数
LocalDate nextDay = dateStart.plusDays(1);
// 获取年、月、日
int getYear = dateStart.getYear();

六、总结

  1. Java 8+ 优先使用 java.time 处理日期,线程安全、API 简洁;
  2. LocalDate.of() 快速创建年月日对象,isAfter()/isBefore() 轻松比较日期;
  3. ChronoUnit.DAYS.between() 精准计算日期间隔天数,是日期计算的最优方案;
  4. 本案例覆盖日期解析、对象创建、比较、计算四大核心场景,可直接用于实际开发。

更多推荐