QUARTZ:不支持星期几和月份参数

Posted

技术标签:

【中文标题】QUARTZ:不支持星期几和月份参数【英文标题】:QUARTZ : Both, a day-of-week AND a day-of-month parameter, are not supported 【发布时间】:2018-05-26 07:56:51 【问题描述】:

我正在使用cron-utils 库进行调度。当我同时提供 DoM 和 DoW 时,我得到以下异常

不支持星期几和月份参数。

我发现这个异常符合QUARTZ规范。 我想知道为什么不支持?因为在“9 月 5 日仅在星期日”运行类似的东西似乎是有效的要求 我是否需要编写两个单独的表达式并取其交集? 这个问题的推荐解决方案是什么?

【问题讨论】:

如果你的库不支持它,你真的不能用它做任何事情。可能不支持它,因为它很少有未被覆盖的边缘情况。例如粘贴这个: 0 0 0 5 * SUN * here defineyourtimepattern.net 事实证明这是非常罕见的发生。根据我的经验,cron 实现仅经过测试以适合最常见的表达式,并且当您尝试做一些花哨的事情时不支持您可以做的是像 0 0 0 5 * * * 那样实现它并在脚本中检查它是否星期日。然后运行你的逻辑。 【参考方案1】:

Quartz 不支持该功能。但是,这可以通过自定义 cron 定义在 cron-utils 中实现。为了反映 Quartz 的相同定义,但不受日期和星期几的限制,您可以这样做:

CronDefinition cronDefinition =
    CronDefinitionBuilder.defineCron()
        .withSeconds().withValidRange(0, 59).and()
        .withMinutes().withValidRange(0, 59).and()
        .withHours().withValidRange(0, 23).and()
        .withDayOfMonth().withValidRange(1, 31).supportsL().supportsW().supportsLW().supportsQuestionMark().and()
        .withMonth().withValidRange(1, 12).and()
        .withDayOfWeek().withValidRange(1, 7).withMondayDoWValue(2).supportsHash().supportsL().supportsQuestionMark().and()
        .withYear().withValidRange(1970, 2099).withStrictRange().optional().and()
        .instance();

CronParser parser = new CronParser(cronDefinition);
parser.parse("0 0 0 3 * MON#1");

【讨论】:

以上是关于QUARTZ:不支持星期几和月份参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在雪花 sql 中使用 date_trunc 更改默认的星期几和时间戳

使用 to_date oracle 函数使用星期数和天数 oracle

当今天与星期几匹配时,Quartz 会忽略每日日程安排的时间

错误获取星期几

js怎么判断月份的第一天是周几?

计算当天为星期几