jmrozanec / cron-utils

Cron utils for parsing, validations and human readable descriptions as well as date/time interoperability.
http://cron-utils.com
Apache License 2.0
1.15k stars 262 forks source link

ExecitionTime not working when using QUARTZ and time is beyond 2100. #610

Closed Eyre-S closed 11 months ago

Eyre-S commented 11 months ago

Sorry that I later knows that quartz does not allow year above 2099.


When the input time (or output time) is over 2100, the output will be null (Optional.empty exactly).

scala> var cron = CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ)).parse("0 0 0 * * ?")
var cron: com.cronutils.model.Cron = com.cronutils.model.SingleCron@31183ee2

scala> var exec = ExecutionTime.forCron(cron)
var exec: com.cronutils.model.time.ExecutionTime = com.cronutils.model.time.SingleExecutionTime@249a45fd

scala>  exec.nextExecution(ZonedDateTime.parse("2023-11-09T06:13:00.000Z"))
val res0: java.util.Optional[java.time.ZonedDateTime] = Optional[2023-11-10T00:00Z]

scala> exec.nextExecution(ZonedDateTime.parse("2123-11-09T06:13:00.000Z"))
val res1: java.util.Optional[java.time.ZonedDateTime] = Optional.empty

scala> ZonedDateTime.parse("2123-11-09T06:13:00.000Z")
val res2: java.time.ZonedDateTime = 2123-11-09T06:13Z

scala> exec.nextExecution(ZonedDateTime.parse("2099-11-09T06:13:00.000Z"))
val res5: java.util.Optional[java.time.ZonedDateTime] = Optional[2099-11-10T00:00Z]

scala> exec.nextExecution(ZonedDateTime.parse("2100-11-09T06:13:00.000Z"))
val res6: java.util.Optional[java.time.ZonedDateTime] = Optional.empty

scala> exec.nextExecution(ZonedDateTime.parse("2099-12-31T06:13:00.000Z"))
val res7: java.util.Optional[java.time.ZonedDateTime] = Optional.empty

When using CronType.UNIX, it seems works well

scala> var cron = CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.UNIX)).parse("0 0 * * *")
var cron: com.cronutils.model.Cron = com.cronutils.model.SingleCron@4e4af370

scala> var exec = ExecutionTime.forCron(cron)
var exec: com.cronutils.model.time.ExecutionTime = com.cronutils.model.time.SingleExecutionTime@cd93621

scala> exec.nextExecution(ZonedDateTime.parse("2099-11-09T06:13:00.000Z"))
val res8: java.util.Optional[java.time.ZonedDateTime] = Optional[2099-11-10T00:00Z]

scala> exec.nextExecution(ZonedDateTime.parse("2199-11-09T06:13:00.000Z"))
val res9: java.util.Optional[java.time.ZonedDateTime] = Optional[2199-11-10T00:00Z]