Java中如何将时间区间拆分为单个年度分段?
拆分日期区间为年度分段的Java实现
要实现将起始日期到结束日期拆分为年度分段的需求,你可以按年份循环遍历,根据当前年份是起始年、中间年还是结束年,分别计算对应分段的起止日期,用Java 8+的java.time API就能轻松完成。
实现代码
import java.time.LocalDate; import java.util.ArrayList; import java.util.List; public class DateSegmenter { public static void main(String[] args) { LocalDate startDate = LocalDate.parse("2022-12-01"); LocalDate finishDate = LocalDate.parse("2024-10-05"); List<DateRange> segments = splitIntoYearlySegments(startDate, finishDate); // 输出分段结果 int segmentNum = 1; for (DateRange range : segments) { System.out.printf("p%d = %s ... %s%n", segmentNum++, range.getStart(), range.getEnd()); } } private static List<DateRange> splitIntoYearlySegments(LocalDate start, LocalDate end) { List<DateRange> segments = new ArrayList<>(); int startYear = start.getYear(); int endYear = end.getYear(); for (int year = startYear; year <= endYear; year++) { LocalDate segmentStart; LocalDate segmentEnd; if (year == startYear) { // 起始年份:保留原开始日期,结束到当年年末 segmentStart = start; segmentEnd = LocalDate.of(year, 12, 31); } else if (year == endYear) { // 结束年份:从当年年初开始,到原结束日期 segmentStart = LocalDate.of(year, 1, 1); segmentEnd = end; } else { // 中间年份:取完整的一年 segmentStart = LocalDate.of(year, 1, 1); segmentEnd = LocalDate.of(year, 12, 31); } // 额外校验:避免分段结束日期超过总结束日期(处理边界场景) if (segmentEnd.isAfter(end)) { segmentEnd = end; } segments.add(new DateRange(segmentStart, segmentEnd)); } return segments; } // 用于存储单段日期范围的内部类 static class DateRange { private final LocalDate start; private final LocalDate end; public DateRange(LocalDate start, LocalDate end) { this.start = start; this.end = end; } public LocalDate getStart() { return start; } public LocalDate getEnd() { return end; } } }
关键逻辑说明
- 循环范围:从起始日期的年份遍历到结束日期的年份,确保覆盖所有涉及的年度
- 起始年份处理:直接使用原始起始日期,结束日期设为当年12月31日(也可以用
TemporalAdjusters.lastDayOfYear()替代硬编码的12月31日,适配不同历法) - 中间年份处理:直接取当年的完整年度(1月1日到12月31日)
- 结束年份处理:从当年1月1日开始,到原始结束日期结束
- 边界校验:添加判断确保分段结束日期不会超过总结束日期,兼容起始和结束日期同一年的场景
运行代码后,输出结果和你预期的一致:
p1 = 2022-12-01 ... 2022-12-31 p2 = 2023-01-01 ... 2023-12-31 p3 = 2024-01-01 ... 2024-10-05
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

