我的服务 api 接受石英作业的开始日期和要执行的作业的月份日期。
在内部,我将其转换为 cron 表达式并保存在quartz 中。
例如,PST 中的用户今天(2017 年 11 月 3 日)提交了如下作业请求。
{
"start": "2017-11-03T18:00:00-07:00",
"dayOfMonth" : 15
}
此处,用户希望安排一个作业,从 2017 年 11 月 3 日开始,每月 15 日下午 6 点触发。所以第一天石英会火的时间是2017年11月15日。
这就是上面的请求转换为 cron 表达式的方式0 0 18 15 * ? *
, 哪个是对的。
QRTZ_CRON_TRIGGERS 表如下所示。
正如您所注意到的,time_zone_id 保存为 GMT-07:00,但一旦 11 月 5 日夏令时开始,它必须是 GMT-08:00。否则我的石英工作将提前一小时触发。事实上,当我查询下一个火灾时间,我确实得到了 1510794000000 这确实是2017 年 11 月 15 日星期三 17:00:00(下午) 美国/洛杉矶时区 (PST)
我们如何处理这个 time_zone_id 问题?
P.S:我使用的 cronTrigger 没有这个概念preserveHourOfDayAcrossDaylightSavings
这是由提供的CalendarIntervalTrigger
.
不要使用 offset 来表示时区。相反,您可以要求用户传递时区,例如“美洲/洛杉矶”。然后你可以使用http://www.quartz-scheduler.org/api/2.2.1/org/quartz/CronScheduleBuilder.html#inTimeZone(java.util.TimeZone) http://www.quartz-scheduler.org/api/2.2.1/org/quartz/CronScheduleBuilder.html#inTimeZone(java.util.TimeZone)创建具有正确时区的触发器。
inTimeZone(TimeZone.getTimeZone("USER_ENTERED_VALUE")
最后,当您查看 QRTZ_CRON_TRIGGERS 表时,TIME_ZONE_ID 的值将是美洲/洛杉矶
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)