使用startdate和timezone设置石英计划

时间:2014-12-03 07:59:36

标签: quartz-scheduler

我有以下方法来安排作业在不同的时区和开始日期被解雇。

如果服务器的时区是亚洲/台北,并且时间表设置为以下输入:

triggerName="testTrigger",
jobName="testJob", 
group="testGroup", 
startDate = 2014-12-03 18:00:00
timezoneString = "Austrailia/Melbourne"
cronExp = 0 0/1 * 1/1 * ? *

何时应该是开火时间?

  public void schedule(String triggerName, String jobName, String group, Date startDate,       String timezoneString, String cronExp){
    try {
        JobDetail jobDetail = new JobDetail(jobName, group, MessageJob.class);

        TimeZone timeZone = TimeZone.getTimeZone(timezoneString);
        Date startDate = startDate;

        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(startDate);
        cal1.setTimeZone(timeZone);
        startDate = cal1.getTime();

        CronTrigger cronTrigger = new  CronTrigger(triggerName, group, jobName, jobGroup, startDate, null, cronExp, timeZone);
        scheduler.start();

    } catch (ParseException e) {
        System.out.println("ParseException issues " + e.getMessage());
    }catch(IllegalArgumentException e){
        System.out.println("IllegalArgumentException issues " + e.getMessage());
    }
}

1 个答案:

答案 0 :(得分:1)

如果您在Quartz cron触发器中明确设置了不同的时区,则触发器将根据指定时区中的触发器配置触发。即您的cron触发器表达将使用澳大利亚/墨尔本时区进行评估。

为了证明这一点,我在QuartzDesk创建了澳大利亚/墨尔本时区的示例cron触发器。我当地的时区是CET(中欧时间)。在GUI中,您可以清楚地看到Quartz返回的触发器的下一个开火时间是2014-12-04 14:00:00(在本地CET时区)。

Australia/Melbourne trigger in QuartzDesk

现在,当您将此时间转换为澳大利亚/墨尔本时区(我使用此online converter)时,我得到2014-12-04 00:00:00这是预期的触发时间:

Midnight in Australia/Melbourne timezone = 14:00:00 in CET timezone

当你的cron表达式(0 0/1 * 1/1 *?*)触发时,它会在每小时(01:00:00,01:01:00,...)每分钟触发一次澳大利亚/墨尔本时区。现在考虑到台北是澳大利亚/墨尔本+ 3小时,那么你的时区的火灾时间将是21:01:00,21:02:00,...