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

标签 java cron schedule quartz hijri

有没有办法使用伊斯兰日历来安排 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/

相关文章:

java - 只是好奇...更好的方法复制/克隆 ArrayList 的一部分?

java - 在 PrintWriter 中设置格式

java - 在 C++ 和 Java 之间传输数据最快的方法是什么

service - 无法在 PowerBI 服务中安排刷新

iOS 如何设置应用提醒

java - Gradle:如何在单独的进程/JVM 上运行 Sonar

php - PHP 脚本中的一般 "Killed"错误

bash - 从 cron 作业创建空的 catalina.out(基于刚刚删除的 catalina.out)

linux - 如何测试用crontab部署的脚本

database - 可恢复与不可恢复计划