Java 日期比较与计算:使用 java.time 优雅处理日期
·
在 Java 开发中,日期的比较、计算是高频场景。传统的 Date、Calendar 类存在线程不安全、API 繁琐等问题,Java 8 引入的 java.time 日期时间 API 彻底解决了这些痛点,它线程安全、设计简洁、语义清晰,是处理日期的最佳选择。
本文将通过一个日期比较 + 间隔天数计算的实战案例,带你掌握 java.time 核心类 LocalDate 的用法,完美解决日期比较、天数计算需求。
一、需求分析
- 接收用户输入的两个日期(支持
-///.分隔,如2025-01-01) - 创建两个日期对象
- 计算两个日期相隔的天数
- 判断后一个日期是否在前一个日期之后
- 输出结果
二、核心知识点:java.time.LocalDate
LocalDate 是 java.time 包下的本地日期类,仅表示年月日,不包含时间和时区,是处理日期的核心类:
- 不可变类:线程安全,修改日期会返回新对象
- 静态方法
of():快速创建日期对象 - 比较方法:
isAfter()、isBefore()、equals()直接判断日期先后 - 天数计算:结合
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 / 代码 2:创建 LocalDate 对象
LocalDate.of(年, 月, 日)是静态工厂方法,直接传入 int 类型的年、月、日,返回不可变的LocalDate对象,替代了传统Calendar的繁琐赋值。 -
代码 3:计算间隔天数
ChronoUnit.DAYS.between(起始日期, 结束日期):- 精确计算两个日期的天数差
- 若结束日期在起始日期之前,返回负数
- 配合
Math.abs()可以获取绝对值天数
-
代码 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();
六、总结
- Java 8+ 优先使用
java.time处理日期,线程安全、API 简洁; LocalDate.of()快速创建年月日对象,isAfter()/isBefore()轻松比较日期;ChronoUnit.DAYS.between()精准计算日期间隔天数,是日期计算的最优方案;- 本案例覆盖日期解析、对象创建、比较、计算四大核心场景,可直接用于实际开发。
更多推荐
所有评论(0)