| | |
| | | return calculateMonthlyNextTime(frequencyDetail, currentTime); |
| | | case "QUARTERLY": |
| | | return calculateQuarterlyNextTime(frequencyDetail, currentTime); |
| | | case "YEARLY": |
| | | return calculateYearlyNextTime(frequencyDetail, currentTime); |
| | | default: |
| | | throw new IllegalArgumentException("不支持的频率类型: " + frequencyType); |
| | | } |
| | |
| | | throw new IllegalArgumentException("无法找到下一次执行时间"); |
| | | } |
| | | |
| | | private static LocalDateTime calculateYearlyNextTime(String detail, LocalDateTime current) { |
| | | String[] parts = validateAndSplit(detail, ",", 3); |
| | | int month = validateMonth(parts[0]); |
| | | int dayOfMonth = validateDayOfMonth(parts[1]); |
| | | LocalTime time = parseTime(parts[2]); |
| | | |
| | | for (int i = 0; i < 5; i++) { |
| | | int year = current.getYear() + i; |
| | | YearMonth targetYearMonth = YearMonth.of(year, month); |
| | | int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth()); |
| | | LocalDateTime target = LocalDateTime.of( |
| | | year, |
| | | month, |
| | | adjustedDay, |
| | | time.getHour(), |
| | | time.getMinute() |
| | | ); |
| | | if (target.isAfter(current)) { |
| | | return target; |
| | | } |
| | | } |
| | | throw new IllegalArgumentException("无法找到下一次执行时间"); |
| | | } |
| | | |
| | | private static LocalTime parseTime(String timeStr) { |
| | | try { |
| | | return LocalTime.parse(timeStr, TIME_FORMATTER); |