cron表达式不能按照指定日期开始周期执行

发现cron表达式 很坑啊,有一个基本功能不能满足,指定日期开始按周期执行

比如,指定今天9点开始每隔1小时运行一次,cron表达式为:0 0 9/1 * * ?

最近10次运行时间为
2023-03-30 16:00:00
2023-03-30 17:00:00
2023-03-30 18:00:00
2023-03-30 19:00:00
2023-03-30 20:00:00
2023-03-30 21:00:00
2023-03-30 22:00:00
2023-03-30 23:00:00
2023-03-31 09:00:00(从第二天9点开始)
2023-03-31 10:00:00

可以看出,24小时为一个周期,无法做到循环执行

想到的办法就是先睡眠到指定时间,然后按0 0 0/1 * * ? 执行

再或者,我想当前时间50分开始,每隔30分钟执行一次,cron表达式:0 50/30 * * * ?
最近10次执行时间为
2023-03-30 17:50:00
2023-03-30 18:50:00
2023-03-30 19:50:00
2023-03-30 20:50:00
2023-03-30 21:50:00
2023-03-30 22:50:00
2023-03-30 23:50:00
2023-03-31 00:50:00
2023-03-31 01:50:00
2023-03-31 02:50:00
变成了50分开始,每隔一小时执行一次了,再次说明cron是以0-59(单位是分)0-23(单位为时)其他类似。为周期,这个周期内干不完,下个周期重新算起。

so 朋友们有没有解决办法啊或替代方法

该回答引用GPT:
cron表达式不支持按照指定日期开始周期执行,只能按照每天的固定时间来执行,比如每天9点开始每隔1小时执行一次,表达式为0 0 9/1 * * ?,但是这样的表达式会导致每次执行的时间都是从第二天9点开始,而不是从指定日期开始。要解决这个问题,可以先编写代码,计算出指定日期到现在的时间差,然后睡眠到指定时间,再按照0 0 0/1 * * ?的表达式来执行。

// 计算指定日期到现在的时间差
long sleepTime = specifiedDate.getTime() - System.currentTimeMillis();
// 睡眠到指定时间
Thread.sleep(sleepTime);
// 按照0 0 0/1 * * ?的表达式来执行
// ...

如还有疑问,可留言帮助解决。