2

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

我相信 SimpleTrigger 是我需要的,但我不知道如何为它设置时区。

任何想法?

4

2 回答 2

2

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。

于 2012-09-24T13:51:25.240 回答
1

我有同样的要求。我能够使用以下方式实现这一点。

  1. 将用户时间转换为 UTCutcTime =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();
    }
    

public static Date utcTimetoUserTime(String utcTime) { return new DateTime(utcTime).toDate(); }

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

于 2017-09-27T07:30:42.213 回答