如何依据发生次数计算重复事件的结束日期(含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
相关产品推荐
相关产品推荐

