1

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

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

我正在努力寻找 Java Quartz 文档中最小的线索(QA 部分提到了 1 个),并且我检查了源代码并发现默认日历(在CronExpression.java中找到)是公历。有没有办法通过使用包含/排除 org.quartz.Calendar 来实现这一点?我觉得不会吧?

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

暂时,我正在考虑手动将多个 org.quartz.Trigger 日期绑定到工作(从伊斯兰转换为公历)。但是,这并不是最优的,因为单个 cron 表达式可能会导致十几个或数百个日期。

抱歉,对于不是那么技术性的问题,但该主题似乎未被发现且信息稀少。

4

1 回答 1

2

由于伊斯兰历和公历没有对齐,而且伊斯兰月的长度与公历不同,因此相当棘手。我建议执行以下样式(Linux Cron Style)的 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 日。[来源:维基百科]

于 2018-10-16T10:57:59.407 回答