在特定的TimeZone上运行Quartz Scheduler

时间:2014-12-04 11:04:47

标签: java quartz-scheduler

我正在使用Quartz调度程序来安排一些工作。以下是我的要求。

  • 所有工作必须在美国东部时间00:00运行。
  • 除星期六外,所有工作都会每天运作。

所以第二个工作正常。但它不是在EST上运行它,而是在GMT上运行。虽然我已将时区设为EST。

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
WeeklyCalendar  weeklyOff = new WeeklyCalendar ();
weeklyOff.setTimeZone(TimeZone.getTimeZone("est"));
weeklyOff.setDayExcluded(java.util.Calendar.SATURDAY, true);
scheduler.addCalendar("weeklyOff", weeklyOff, false,false);


JobDetail jobScheduleScan = JobBuilder.newJob(jobScheduleScan.class).withIdentity("scheduleScan", "alpaca").build();


Trigger triggerScheduleScan = TriggerBuilder
                        .newTrigger()
                        .withIdentity("scheduleTrigger", "alpaca")
                        .startNow()
                        //.withSchedule(simpleSchedule().withIntervalInHours(1).repeatForever())
                        .withSchedule(dailyAtHourAndMinute(00, 00).inTimeZone(TimeZone.getTimeZone("est"))) 
                        .modifiedByCalendar("weeklyOff")
                        .build();


scheduler.scheduleJob(jobScheduleScan,triggerScheduleScan);

scheduler.start();

1 个答案:

答案 0 :(得分:2)

这是问题所在:

TimeZone.getTimeZone("est")

我怀疑你写道:

System.out.println(TimeZone.getTimeZone("est"));

你会得到像

这样的东西
sun.util.calendar.ZoneInfo
[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]

基本上" est"不是有效的时区ID。我怀疑你并不意味着" EST"无论如何,但是"东部时间"这是EST和EDT,适当切换。为此,你应该使用" America / New_York"的ID,所以:

weeklyOff.setTimeZone(TimeZone.getTimeZone("America/New_York"));

如果确实想要一个固定的UTC-5时区,您可以使用:

weeklyOff.setTimeZone(TimeZone.getTimeZone("GMT-05:00"));