使用非公历 cron 表达式安排作业

Schedule job using non Gregorian calendar cron expression

有没有办法使用伊斯兰日历来安排 cron 作业?理想情况下:

CronExpression cronExpression = new CronExpression("0 0 0 1 * ? *", CalendarEnum.ISLAMIC);

我正在努力寻找关于 Java Quartz 文档的最小线索(在 QA 部分提到 1)并且我检查了源代码并发现默认日历(在 CronExpression.java) 是公历。有没有办法通过使用 inclusion/exclusion org.quartz.Calendar 来实现?我想不是吧?

有谁知道如何 extend/implement cron 表达式的不同变体来涵盖例如伊斯兰日历?或者替代的开源库(托管在 mvn 中央仓库上)?或者任何方法,以实现一种抽象的方式来表达重复(例如,每个伊斯兰月的第一天重复一次)?

暂时,我正在考虑手动将多个 org.quartz.Trigger 日期绑定到作业(从伊斯兰教转换为公历)。但是,这不是最佳选择,因为单个 cron 表达式可能会产生十几个或一百个日期。

抱歉,这个不是很技术性的问题,但该主题似乎未被公开且信息稀少。

由于伊斯兰历和公历不一致,而且伊斯兰月的长度与公历月不同,所以这很棘手。我建议执行以下样式的 cron 实现(Linux Cron 样式):

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  x  y  *  *  *   IslamicMonthTestCmd && command

我们的想法是每天在 x 小时 y 分钟进行测试,以检查您是否在伊斯兰月的第一天。这是由 IslamicMonthTestCmd 完成的,您仍然需要自己编写。如果此测试通过,则执行 command.

写这个 IslamicMonthTestCmd 并不简单,因为与公历相反,伊斯兰历法深受人类影响。月份取决于宗教权威对新月的可见度,因此可能会有一两天的变化,这显然受到人、天气和其他各种干扰的影响。当前伊斯兰年是伊斯兰历 1440 年。在公历中,1440 AH 从 大约 2018 年 9 月 11 日到 2019 年 8 月 30 日运行。[来源:Wikipedia]