如何从 20.35 到 23.35 每 30 分钟 运行 一份工作,每周有几天?

How to run a job from 20.35 until 23.35 every 30 minutes, some days a week?

我遇到了 cron 表达式的问题。 从周四到周日,我必须每 30 分钟 运行 一个方法。它的时间将从 20:35 分钟开始直到 23:35 分钟。

Cron 表达式:

"0 35/30 20-23 ? * THU-SUN";

据我了解;我的方法将在周四每 30 分钟 20:35 分钟调用一次,直到周日。

我的期望:

方法将按照以下时间调用:

Thu May 19 20:35:00 IST 2016
Thu May 19 21:05:00 IST 2016
Thu May 19 21:40:00 IST 2016

但是;方法 get 按以下时间调用:

Thu May 19 20:35:00 IST 2016
Thu May 19 21:35:00 IST 2016
Thu May 19 22:35:00 IST 2016

谁能帮帮我。为什么 cron 表达式每 1 小时计算一次??

这是代码示例:

@Scheduled(cron="0 35/30 20-23 ? * THU-SUN")
  public void startInboundSFTPChannel(){
      logger.info("Cron job started....");
      downloadSftpFilesController();
  }

据我了解,您的表达方式 (0 35/30 20-23 ? * THU-SUN) 表示:

  • 0 - 运行 仅整分钟,
  • 35/30 - 运行每30分钟从35开始,
  • 20-23 - 运行 20 到 23 小时,
  • ? - 使用表达式后面部分的隐式天数,
  • * 运行 每个月,
  • THU-SUN - 运行 在周四、周五、周六和周日。

因此,当您指定一个增量而不是两个值时,Quartz(Spring 使用)尝试按如下方式计算:

  • 首先,它计算分钟的值 35 - 匹配 0-59 条件的值,
  • 其次,它将 30 添加到之前的 35(等于 65)不符合 0-59 条件的部分,
  • 最后,唯一正确的值是35

因此,当分钟 == 35.

时,它会每小时 运行 发送一次您的代码

你能在 Thu May 19 20:05:00 IST 2016 再处理一次 运行 代码吗?

如果是,那么您可以使用以下表达式之一:

  1. 0 5,35 20-23 ? * THU-SUN

这意味着:

  • 0 - 运行 仅整分钟,
  • 5,35 - 运行 每 30 分钟,从分钟 == 5 开始,
  • 20-23 - 运行 20 到 23 小时,
  • ? - 使用表达式后面部分的隐式天数,
  • * - 运行 每个月,
  • THU-SUN - 运行 在周四、周五、周六和周日。

    1. 0 5/30 20-23 ? * THU-SUN

这意味着:

  • 0 - 运行 仅整分钟,
  • 5/30 - 运行 从分钟 == 5 开始每 30 分钟,
  • 20-23 - 运行 20 到 23 小时,
  • ? - 使用表达式后面部分的隐式天数,
  • * - 运行 每个月,
  • THU-SUN - 运行 在周四、周五、周六和周日。

Here你可以找到类似的问题。

如果你想让命令运行从周四到周日每天20.35到23.35,你可以分两步定义:

35   20    ? * THU-SUN
5-59 21-23 ? * THU-SUN

没有简单的方法可以仅在 cron 表达式中进行设置,因为您不希望它在 20.05 运行。

即:在 20 点,运行 在 35 分钟。在 21 到 23 点,every 30 minutes with an offset of 5 minutes


我的回答基于以下格式:

 +---------------- minute (0 - 59)
 |  +------------- hour (0 - 23)
 |  |  +---------- day of month (1 - 31)
 |  |  |  +------- month (1 - 12)
 |  |  |  |  +---- day of week (0 - 6) (Sunday=0 or 7)
 |  |  |  |  |
 *  *  *  *  *  command to be executed