我需要为包含时区的作业设置石英触发器。例如,我需要将其设置为 2012 年 8 月 27 日欧洲/阿姆斯特丹时区 15:00。我的服务器在 UTC 上工作。
我相信 SimpleTrigger 是我需要的,但我不知道如何为它设置时区。
任何想法?
我需要为包含时区的作业设置石英触发器。例如,我需要将其设置为 2012 年 8 月 27 日欧洲/阿姆斯特丹时区 15:00。我的服务器在 UTC 上工作。
我相信 SimpleTrigger 是我需要的,但我不知道如何为它设置时区。
任何想法?
SimpleTrigger 的触发时间基于配置的开始时间。
开始时间指定为 java.util.Date,它实际上只是自 1970 年 1 月 1 日 00:00:00.000 GMT 以来以毫秒为单位指定的时间。
如果在 2010 年 10 月 23 日 8:13:45 EST 您的代码执行 new Date(),并将结果设置为开始时间,Quartz 将以毫秒 (1287839625000) 为单位的值存储为开始时间,然后触发器将无论调度程序在哪个时区运行,都会在 2010 年 10 月 23 日 8:13:45 EST 触发。
如果您使用 java.util.Calendar 在特定时区定义日期和时间,然后将其转换为日期,它将完全相同:如果您指定了 Oct 23, 2010 8:13:45 和日历的时区为 EST,那么生成的毫秒值将再次为 1287839625000。但如果时区为 PST(但日期时间相同),则毫秒值将为 1287850425000(3 小时后)。
只需确保运行 Quartz 的系统时钟已正确设置并由操作系统维护为 UTC。
我有同样的要求。我能够使用以下方式实现这一点。
utcTime =userTimetoUTCTime("09/28/2017 12:00:00 AM")
重新将 UTC 转换为服务器时区并将其设置为简单触发器utcTimetoUserTime(utcTime)
public static String userTimetoUTCTime(String userTime) {
ZoneId zone = ZoneId.systemDefault();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a").withZone(zone);
ZonedDateTime utc = ZonedDateTime.parse(userTime, fmt).withZoneSameInstant(ZoneOffset.UTC);
// Convert Local Time to UTC
OffsetDateTime gmtTime = utc.toOffsetDateTime().withOffsetSameInstant(ZoneOffset.UTC);
// Utc to local time
// gmtTime.atZoneSameInstant(ZoneId.systemDefault()).toString();
return gmtTime.toString();
}
public static Date utcTimetoUserTime(String utcTime) {
return new DateTime(utcTime).toDate();
}
注意:可以在CronTrigger中设置时区,但不能在 SimpleTrigger中设置