Skip to content

Commit 324ce51

Browse files
committed
⚡️ 优化下一次运行时间显示 #1093
1 parent 933872b commit 324ce51

File tree

2 files changed

+24
-10
lines changed

2 files changed

+24
-10
lines changed

src/pkg/utils/cron.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { CronTime } from "cron";
2+
import dayjs from "dayjs";
23

4+
// 计算下次执行时间,支持 once 关键字表示每分钟/每小时/每天/每月/每星期执行一次
35
export function nextTime(crontab: string, date?: Date): string {
46
let oncePos = 0;
57
if (crontab.includes("once")) {
@@ -19,21 +21,25 @@ export function nextTime(crontab: string, date?: Date): string {
1921
} catch {
2022
throw new Error("错误的定时表达式");
2123
}
22-
const datetime = cron.getNextDateFrom(date || new Date());
24+
let datetime = dayjs(date || new Date());
25+
if (oncePos === 2) {
26+
datetime = datetime.set("minute", 0).subtract(1, "minute").set("second", 0);
27+
}
28+
const nextdate = cron.getNextDateFrom(datetime.toDate());
2329
if (oncePos) {
2430
switch (oncePos) {
2531
case 1: // 每分钟
26-
return datetime.toFormat("yyyy-MM-dd HH:mm 每分钟运行一次");
32+
return nextdate.toFormat("yyyy-MM-dd HH:mm:ss 每分钟运行一次");
2733
case 2: // 每小时
28-
return datetime.plus({ hour: 1 }).toFormat("yyyy-MM-dd HH 每小时运行一次");
34+
return nextdate.plus({ hour: 1 }).toFormat("yyyy-MM-dd HH:mm:ss 每小时运行一次");
2935
case 3: // 每天
30-
return datetime.plus({ day: 1 }).toFormat("yyyy-MM-dd 每天运行一次");
36+
return nextdate.plus({ day: 1 }).toFormat("yyyy-MM-dd 每天运行一次");
3137
case 4: // 每月
32-
return datetime.plus({ month: 1 }).toFormat("yyyy-MM 每月运行一次");
38+
return nextdate.plus({ month: 1 }).toFormat("yyyy-MM 每月运行一次");
3339
case 5: // 每星期
34-
return datetime.plus({ week: 1 }).toFormat("yyyy-MM-dd 每星期运行一次");
40+
return nextdate.plus({ week: 1 }).toFormat("yyyy-MM-dd 每星期运行一次");
3541
}
3642
throw new Error("错误表达式");
3743
}
38-
return datetime.toFormat("yyyy-MM-dd HH:mm:ss");
44+
return nextdate.toFormat("yyyy-MM-dd HH:mm:ss");
3945
}

src/pkg/utils/utils.test.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { nextTime } from "./cron";
55
import dayjs from "dayjs";
66

77
describe.concurrent("nextTime", () => {
8-
const date = new Date(1737275107000);
8+
const date = new Date(1737275111000);
99
// 让程序先执行一下,避免超时问题
1010
beforeAll(() => {
1111
nextTime("* * * * *");
@@ -16,11 +16,19 @@ describe.concurrent("nextTime", () => {
1616
});
1717
it.sequential("每分钟一次表达式", () => {
1818
expect(nextTime("once * * * *", date)).toEqual(
19-
dayjs(date).add(1, "minute").format("YYYY-MM-DD HH:mm 每分钟运行一次")
19+
dayjs(date).add(1, "minute").format("YYYY-MM-DD HH:mm:00 每分钟运行一次")
20+
);
21+
expect(nextTime("10 once * * * *", date)).toEqual(
22+
dayjs(date).add(1, "minute").format("YYYY-MM-DD HH:mm:10 每分钟运行一次")
2023
);
2124
});
2225
it.sequential("每小时一次表达式", () => {
23-
expect(nextTime("* once * * *", date)).toEqual(dayjs(date).add(1, "hour").format("YYYY-MM-DD HH 每小时运行一次"));
26+
expect(nextTime("* once * * *", date)).toEqual(
27+
dayjs(date).add(1, "hour").format("YYYY-MM-DD HH:00:00 每小时运行一次")
28+
);
29+
expect(nextTime("10 once * * *", date)).toEqual(
30+
dayjs(date).add(1, "hour").format("YYYY-MM-DD HH:10:00 每小时运行一次")
31+
);
2432
});
2533
it.sequential("每天一次表达式", () => {
2634
expect(nextTime("* * once * *", date)).toEqual(dayjs(date).add(1, "day").format("YYYY-MM-DD 每天运行一次"));

0 commit comments

Comments
 (0)