上一篇
在Java中计算两个日期之间的天数差,使用
java.time包的
LocalDate和
ChronoUnit.DAYS.between()方法。 ,“
java,long days = ChronoUnit.DAYS.between(startDate, endDate);,`
,确保日期对象为LocalDate`类型,结果返回间隔天数(不包含结束日当天)。
在Java中计算“天数的和”通常涉及两种场景:一是计算两个日期之间的天数差(即日期差),二是对多个时间段的天数进行累加求和,下面将详细讲解这两种需求的实现方法,使用Java 8及以上版本的java.time包(推荐)和旧版java.util.Date两种方式。
计算两个日期之间的天数差
方法1:使用Java 8的java.time包(推荐)
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class DateDifferenceExample {
public static void main(String[] args) {
// 定义起始日期和结束日期
LocalDate startDate = LocalDate.of(2025, 1, 1);
LocalDate endDate = LocalDate.of(2025, 12, 31);
// 计算天数差(endDate - startDate)
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("天数差: " + daysBetween); // 输出: 364
}
}
关键点说明:

ChronoUnit.DAYS.between()直接返回两个LocalDate之间的天数差(精确值)。LocalDate不包含时间信息,避免时区干扰。- 如果结束日期早于开始日期,结果为负数。
方法2:使用旧版java.util.Date
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class LegacyDateDifference {
public static void main(String[] args) {
// 定义日期(注意:月份从0开始计数)
Date startDate = new Date(123, 0, 1); // 2025-01-01
Date endDate = new Date(123, 11, 31); // 2025-12-31
// 计算毫秒差并转换为天数
long diffInMillis = endDate.getTime() - startDate.getTime();
long daysBetween = TimeUnit.MILLISECONDS.toDays(diffInMillis);
System.out.println("天数差: " + daysBetween); // 输出: 364
}
}
注意事项:
Date的年份需用当前年-1900(如2025年 → 123),月份从0开始(1月=0)。- 毫秒转天数时,
TimeUnit会自动取整(忽略小数部分)。
对多个时间段的天数求和
若需累加多个日期区间的总天数(如计算员工总休假天数):

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.List;
public class TotalDaysSumExample {
public static void main(String[] args) {
// 定义多个时间段(开始日期和结束日期对)
List<LocalDate[]> dateRanges = Arrays.asList(
new LocalDate[]{LocalDate.of(2025, 1, 1), LocalDate.of(2025, 1, 10)}, // 10天
new LocalDate[]{LocalDate.of(2025, 2, 1), LocalDate.of(2025, 2, 5)} // 5天
);
// 计算总天数
long totalDays = 0;
for (LocalDate[] range : dateRanges) {
totalDays += ChronoUnit.DAYS.between(range[0], range[1]);
}
System.out.println("总天数: " + totalDays); // 输出: 15
}
}
注意事项
- 时区问题:
- 如果涉及跨时区日期,使用
ZonedDateTime替代LocalDate。
- 如果涉及跨时区日期,使用
- 包含边界日期:
- 若需包含结束日期(如酒店入住),结果需
+1:long daysInclusive = ChronoUnit.DAYS.between(startDate, endDate) + 1;
- 若需包含结束日期(如酒店入住),结果需
- 负值处理:
- 当结束日期早于开始日期时,结果为负数,可用
Math.abs()取绝对值。
- 当结束日期早于开始日期时,结果为负数,可用
- 日期格式验证:
- 解析字符串日期时,用
LocalDate.parse("2025-01-01")确保格式正确(默认ISO格式:yyyy-MM-dd)。
- 解析字符串日期时,用
- 推荐方案:优先使用Java 8的
java.time.LocalDate和ChronoUnit.DAYS.between(),代码简洁且线程安全。 - 旧版兼容:
java.util.Date需手动处理毫秒转换,易出错,仅用于兼容旧系统。 - 复杂场景:多时间段求和时遍历累加,注意边界是否需要
+1。
通过上述方法,可高效解决Java中日期差计算和天数累加的需求,实际开发中务必明确业务对“天数”的定义(是否包含首尾日),避免逻辑错误。

引用说明:本文代码基于Oracle官方Java文档中
java.time包的用法,确保方法权威可靠,详细API参考:Java 17 Date-Time API。
