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

如何依据发生次数计算重复事件的结束日期(含Java实现示例)

基于Java计算重复工作日事件的结束日期

核心逻辑

  • 起始日期计入第1次事件发生
  • 逐天向后遍历,跳过周六、周日(若需要适配法定节假日,可自行在判断规则中扩展黑名单日期)
  • 每匹配到1个符合要求的工作日,计数+1,直到计数达到约定的总发生次数,此时的日期就是结束日期
  • 推荐使用Java 8及以上版本内置的java.time包处理日期,避免旧版Date、CalendarAPI的线程安全、设计缺陷问题

完整代码示例

import java.time.DayOfWeek;
import java.time.LocalDate;

public class RepeatEventEndDateCalculator {

    // 判断是否为工作日(默认仅排除周六、周日,可自行扩展法定节假日排除逻辑)
    private static boolean isWorkDay(LocalDate date) {
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY;
    }

    /**
     * 计算重复工作日事件的结束日期
     * @param startDate 事件起始日期
     * @param totalOccurrences 事件总发生次数,要求≥1
     * @return 结束日期
     */
    public static LocalDate calculateEndDate(LocalDate startDate, int totalOccurrences) {
        if (totalOccurrences < 1) {
            throw new IllegalArgumentException("总发生次数不能小于1");
        }
        int count = 0;
        LocalDate currentDate = startDate;
        while (count < totalOccurrences) {
            if (isWorkDay(currentDate)) {
                count++;
                if (count == totalOccurrences) {
                    break;
                }
            }
            currentDate = currentDate.plusDays(1);
        }
        return currentDate;
    }

    public static void main(String[] args) {
        // 示例场景:起始日期2021-09-30,共发生12次工作日事件
        LocalDate start = LocalDate.of(2021, 9, 30);
        int totalTimes = 12;
        LocalDate endDate = calculateEndDate(start, totalTimes);
        System.out.println("事件结束日期为:" + endDate);
        // 运行输出:事件结束日期为:2021-10-15
    }
}

扩展说明

如果需要考虑国内法定节假日、调休补班的场景,可以在isWorkDay方法中新增逻辑:

  • 维护法定节假日黑名单列表,匹配到的日期直接判定为非工作日
  • 维护调休补班的白名单列表,匹配到的周末日期判定为工作日

内容的提问来源于stack exchange,提问作者Teja sree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:15:03