我用-Duser.timezone=UTC
运行Tomcat。但是,Quartz 调度程序 2.2.1 似乎在欧洲/布拉格运行,这是我的操作系统时区。
有没有办法在自定义时区运行 Quartz 或确定 Quartz 正在使用哪个时区?如果没有,有没有办法以编程方式确定操作系统时区?
Quartz 将使用默认的系统区域设置和时区,并且不会对其进行编程以选取您为应用程序提供的属性 user.timezone。 还要记住,这仅适用于 CronTrigger,而不适用于 SimpleTrigger。
例如,如果您使用的是 Spring:
<bean id="timeZone" class="java.util.TimeZone" factory-method="getTimeZone">
<constructor-arg value="GMT" />
</bean>
<bean id="yourTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="yourJob" />
<property name="cronExpression" value="0 0 0/1 * * ?" />
<property name="timeZone" ref="timeZone" />
</bean>
如果您使用的是纯 Java:
Trigger yourTrigger = TriggerBuilder
.newTrigger()
.withIdentity("TRIGGER-ID", "TRIGGER-GROUP")
.withSchedule(CronScheduleBuilder
.cronSchedule("0 0 0/1 * * ?")
.inTimeZone(TimeZone.getTimeZone("GMT")))
).build();
如果您使用的是 XML 配置文件,例如 示例 在 mkyong 的石英中运行多个作业quartz-config.xml
,您可以在元素中配置时区 time-zone
:
<schedule>
<job>
<name>JobA</name>
<group>GroupDummy</group>
<description>This is Job A</description>
<job-class>com.mkyong.quartz.JobA</job-class>
</job>
<trigger>
<cron>
<name>dummyTriggerNameA</name>
<job-name>JobA</job-name>
<job-group>GroupDummy</job-group>
<!-- It will run every 5 seconds -->
<cron-expression>0/5 * * * * ?</cron-expression>
<time-zone>UTC</time-zone>
</cron>
</trigger>
</schedule>
另请参阅 Java 的 java.util.TimeZone 以查看多个时区的 ID。
您可以调用 setTimeZone() 来为 Quartz 中继承 BaseCalendar 的任何内容设置您选择的时区。
Java的TimeZone类有一个getDefault(),它应该有助于以编程方式确定操作系统时区。