设置石英简单触发器的时区

时间:2012-09-24 13:41:33

标签: java triggers timezone quartz-scheduler

我需要为包含时区的作业设置石英触发器。例如。我需要将它设置为2012年8月27日欧洲/阿姆斯特丹时区15:00。我的服务器使用UTC。

我相信SimpleTriggeris我需要的东西,但我不知道如何设置它的时区。

有什么想法吗?

2 个答案:

答案 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)

我有同样的要求。我能够通过以下方式实现这一目标。

  1. 将用户时间转换为UTC utcTime =userTimetoUTCTime("09/28/2017 12:00:00 AM")
  2. 重新将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();
    }
    
  3. public static Date utcTimetoUserTime(String utcTime) { return new DateTime(utcTime).toDate(); }

    注意:可以在CronTrigger中设置时区,但不能在SimpleTrigger中设置时区