是否可以使用“伊斯兰日历”来安排cron作业?理想情况下:
CronExpression cronExpression = new CronExpression("0 0 0 1 * ? *", CalendarEnum.ISLAMIC);
我正在努力寻找Java Quartz文档的最小线索(“质量检查”部分提到1),并且检查了源代码,发现默认日历(在 CronExpression.java中找到了)是公历。有没有一种方法可以通过使用包含/排除org.quartz.Calendar来实现?我认为不是吗?
是否有人知道如何扩展/实现cron表达式的不同变体以覆盖例如伊斯兰日历?还是其他开放源代码库(托管在mvn Central repo上)?或根本没有任何方法可以实现抽象的重复表达方式(例如,每个伊斯兰月份的每个第一天重复一次)?
暂时,我正在考虑手动将多个org.quartz.Trigger日期绑定到工作(从回教转换为格里高利安)。但是,这并不是最佳选择,因为单个cron表达式可能会导致十二或数百个日期。
很抱歉,对于不是那么技术性的问题,但该主题似乎尚未发现且信息稀疏。
答案 0 :(得分:1)
由于伊斯兰历和公历未对齐,并且伊斯兰月份的长度与公历的长度不同,因此这非常棘手。我建议执行以下样式(Linux Cron样式)的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]