支援 年/月/日/週/時/分/秒 基礎週期,並擴充 農曆節日、每月第 N 個週 X、月倒數第 N 天 等企業級排程需求。核心方法 nextTime() 可直接整合至提醒系統、會議室預約、定時任務觸發器。
public static String nextTime(
String startDate, // 起始日期 yyyy-MM-dd HH:mm:ss
int cyclePeriod, // 間隔數值
String loopPeriod, // 週期類型代碼
Boolean isLunar // 是否農曆計算
)
| 代碼 | 含義 | 範例 |
|---|---|---|
| y / m / d / w / h / f / s | 年/月/日/週/時/分/秒 遞增 | m,3 = 每 3 個月 |
| mn <N> | 每月第 N 天 | mn15 = 每月 15 號 |
| mb <N> | 每月倒數第 N 天 | mb2 = 每月倒數第二天 |
| w <1-7>... | 每週指定星期(可多值) | w135 = 週一、三、五 |
| mn<N>w<X> | 每月第 N 個星期 X | mn1w2 = 每月第一個週二 |
| mb<N>w<X> | 每月倒數第 N 個星期 X | mb2w4 = 每月倒數第二個週四 |
if ("m".equalsIgnoreCase(loopPeriod)) { // 月週期
if (isLunar) {
for (int i=0; i
DateUtils.genDate(int y, int m, int d):組合日期字串DateUtils.calDate(String date, int amount, int field):基於 Calendar 欄位增減TimeUtils.addTime(String datetime, int type, int amount):時/分/秒運算ChineseCalendar:農曆轉公曆核心(可參考 6tail/ChineseCalendar)StringUtils.left/right/indexOf:字串擷取輔助// 每月第一個週五
nextTime("2024-01-01 00:00:00", 1, "mn1w5", false);
// 農曆除夕(農曆十二月三十)
nextTime("2024-02-09 00:00:00", 1, "m", true); // 需配合農曆邏輯判斷閏月
// 每 3 個月倒數第二天
nextTime("2024-01-30 00:00:00", 3, "mb2", false);
將複雜週期規則封裝為單一方法,配合農曆庫即可滿足 90% 以上的中文場景排程需求,程式碼可直接複製整合至 Spring Task / Quartz 排程器。