每45分钟执行一次的Cron表达式

3
我需要一个每45分钟触发一次的cron表达式。
根据文档,我创建了这个表达式: 0 0/45 * * * ?
但是它被按照这样的模式触发:12:00、12:45、13:00、13:45、14:00。
但是我期望和想要的是在12:00、12:45、13:30、14:15触发。
我错过了什么?

为了帮助到任何来到这里的人,添加一个链接到这个问题。链接为:https://dev59.com/3GUq5IYBdhLWcg3waPtC,因为被接受的答案不如这个答案清晰明了。 - Kosmas
4个回答

7

Cron不是用来解决这些问题的。它定义了触发器必须触发的确切日期和时间,而不是间隔。使用一个简单的计划替代它:

TriggerBuilder.Create()
  .StartAt(startDate)
  .WithSimpleSchedule(
    simpleScheduleBuilder => simpleScheduleBuilder.WithIntervalInMinutes(45))
  .Build();

编辑: 它可以是如上所示的简单计划,也可以是多个cron触发器(Quartz作业可以有多个触发器):

0 0/45 12/3 * * ?    # 12:00, 12:45, 15:00, 15:45, ...
0 30 13/3 * * ?      # 13:30, 16:30, ...
0 15 14/3 * * ?      # 14:15, 17:15, ...

很不幸,我正在增强一个项目,但前任开发人员没有实现对简单日程的支持。为了添加对简单日程的支持,这对我来说是太多的工作量了。 - Mori
我已经编辑了答案。我没有看到使用单个cron触发器完成它的任何方法。 - Rafał Rutkowski

3
0 0/45 * * * ?实际上表示“每小时从第0分钟开始,每隔45分钟触发一次”。
你的当前输出是12:00、12:45、13:00、13:45和14:30,这很有道理,除了最后一个时间14:30。
该任务在整点(12:00)开始触发,45分钟后再次触发(12:45),然后重复触发下一个任务,从0分钟开始(13:00),在整点后45分钟(13:45)再次触发。
我不确定为什么它突然会在14:30触发,但如果您将cron输入更改为0 45 * * * ?,我认为它会按照您想要的方式,每隔45分钟触发一次。

14:30 是写错了,我已经修正了。谢谢你指出来。但是你的定时任务也没有起作用。它产生了这个模式 11:45、12:45、1:45、2:45……看起来没有什么办法解决,唯一的解决方案就是使用一个简单的计划表。 - Mori

2

如果需要的话,您可以将间隔更改为 */15。但实际上这会每 45 分钟运行一次:

* * * * * (( $(( $(date '+(\%M+\%H*60)')\%45 )) )) || date >> /tmp/cron_45.out 2>&1

这是唯一能够每45分钟运行cron的答案。它可能依赖于特定的“date”实现,但仍然达到了目标,并且可以根据该命令的其他输出进行适应。 - Twitch Captain

1
这是一个可能会对你有所帮助的解决方法。为每15分钟创建一个计时器。
0 0/15 * * * ? *

保持一个变量作为计数器,每次计时器被触发时增加。当计数器达到3时,触发你的方法并将计数器重置为0。希望这能帮助到在寻找答案的人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接