有没有办法使用伊斯兰日历来安排 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 日期绑定(bind)到作业(从伊斯兰转换为公历)。但是,这并不是最佳选择,因为单个 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
完成的,您仍然需要自己编写。如果此测试通过,则您执行命令
。
编写这个 IslamicMonthTestCmd
并不简单,因为与公历相反,伊斯兰历深受男性的影响。这些月份取决于宗教当局对新月的可见度,因此可能会有一两天的变化,明显受到人群、天气和各种其他干扰的影响。当前的伊斯兰历是伊斯兰历 1440 年。在公历中,夏令时 1440 年大约从 2018 年 9 月 11 日到 2019 年 8 月 30 日。[来源:Wikipedia ]
关于java - 使用非公历 cron 表达式安排作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52831326/