我需要为包含时区的作业设置石英触发器。例如。我需要将它设置为2012年8月27日欧洲/阿姆斯特丹时区15:00。我的服务器使用UTC。
我相信SimpleTriggeris我需要的东西,但我不知道如何设置它的时区。
有什么想法吗?
答案 0 :(得分:2)
SimpleTrigger的开火时间基于配置的开始时间。
开始时间指定为java.util.Date,实际上只是自1970年1月1日00:00:00.000 GMT以来的毫秒时间指定的时间。
如果在2010年10月23日美国东部时间8:13:45您的代码执行新的Date(),并将结果设置为开始时间,Quartz将以毫秒(1287839625000)的值存储为开始时间,然后触发器将于美国东部时间2010年10月23日8:13:45触发,无论调度程序运行在哪个时区。
如果您使用java.util.Calendar定义特定时区的日期和时间,然后将其转换为日期,它将完全相同:如果您已指定2010年10月23日8:13: 45,日历的时区为EST,则结果毫秒值将再次为1287839625000.但如果时区为PST(但日期时间相同),则毫秒值为1287850425000(3小时后)。
确保已正确设置Quartz运行的系统时钟,并由操作系统维护为UTC。
答案 1 :(得分:1)
我有同样的要求。我能够通过以下方式实现这一目标。
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中设置时区