我的服务 api 接受石英作业的 startDate 和要执行的作业的月份日期。在内部,我将其转换为 cron 表达式并保存在石英中。
例如,PST 中的用户今天(2017 年 11 月 3 日)提交了一个工作请求,如下所示。
{
"start": "2017-11-03T18:00:00-07:00",
"dayOfMonth" : 15
}
在这里,用户想要安排一个从 2017-11-03 开始的每个月 15 日下午 6 点触发的作业。所以第一天石英将在 2017-11-15 上火。这就是上述请求转换为 cron 表达式的方式0 0 18 15 * ? *
,这是正确的。这是 QRTZ_CRON_TRIGGERS 表的样子。
如您所见,time_zone_id 保存为 GMT-07:00,但是一旦 11 月 5 日开始夏令时,它必须是 GMT-08:00。否则我的石英作业会提前一小时启动。事实上,当我查询nextFireTime 时,我确实得到了 1510794000000,这确实是美国/洛杉矶 (PST) 时区的 2017 年 11 月 15 日星期三 17:00:00 (pm)
我们如何处理这个 time_zone_id 问题?
PS:我使用不具有的概念cronTriggerpreserveHourOfDayAcrossDaylightSavings
由提供CalendarIntervalTrigger
。
不要使用偏移量来表示时区。相反,您可以要求用户传入时区,例如“ America/Los_Angeles ”。然后您可以使用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 的值将是America/Los_Angeles
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句