【问题标题】:How to run a job from 20.35 until 23.35 every 30 minutes, some days a week?如何每周工作几天,每 30 分钟从 20.35 运行到 23.35?
【发布时间】:2016-09-16 03:25:36
【问题描述】:

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

Cron 表达式:

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

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

我的期望:

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

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

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

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();
  }

【问题讨论】:

  • 您应该告诉我们您的 cron 表达式是如何使用的(也许添加一些代码?)
  • 是不是更容易使用:"0 5,35 20-23 ? * THU-SUN";?
  • 嗨 RC..我添加了一些代码部分。请检查。
  • 嗨@tommus,这个 cron 表达式不起作用。因为它会从晚上 8 点到晚上 11 点每 05 分钟和 35 分钟开始一次。
  • 所以您希望它从星期四 20.35 开始,并在所有日子和时间每 30 分钟运行一次,直到星期日 23.35 或此时间范围内的每一天?

标签: java cron cronexpression


【解决方案1】:

据我了解,您的表达 (0 35/30 20-23 ? * THU-SUN) 的意思是:

  • 0 - 只运行一分钟,
  • 35/30 - 从 35 点开始每 30 分钟运行一次,
  • 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你可以找到类似的问题。

【讨论】:

    【解决方案2】:

    如果希望命令从周四到周日每天 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 
    

    【讨论】:

    • 得到了你。谢谢。如果我从 20:35 分钟开始并及时添加 30 分钟,那么它的添加将是 65。这将大于 (0-59)。这就是为什么我的 cron 表达式没有正确评估的原因。
    • @Kumar 是的,完全正确。您始终可以在 crontab.guru 中评估您的 cron 表达式
    • 谢谢哥们.. @fedorqui
    • 是的@fedorqui。我必须修改 cron 表达式。哪分钟不应超过 59 分钟。
    猜你喜欢
    • 2016-04-02
    • 2021-06-25
    • 2019-11-16
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多