You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:25:38