2017-11-04 2 views
0

Meine Service-API nimmt startDate für Quarzjob und Tag des Monats für die Ausführung des Jobs auf. Intern konvertiere ich dies in Cron-Ausdruck und speichere in Quarz.Wie man Benutzer Zeitzone für die Sommerzeit in Quarz für Cron Trigger behandelt?

Zum Beispiel sendet ein Benutzer in PST heute (3. November 2017) eine Jobanfrage wie folgt.

{ 
"start": "2017-11-03T18:00:00-07:00", 
"dayOfMonth" : 15 
} 

Hier möchte der Benutzer einen Job planen, der am 15. eines jeden Monats um 18:00 Uhr beginnt, beginnend am 2017-11-03. So wird der erste Tag Quarz wird 2017-11-15 Feuer werden. So wird die obige Anfrage in den Cron-Ausdruck 0 0 18 15 * ? * konvertiert, der korrekt ist. So sieht die Tabelle QRTZ_CRON_TRIGGERS aus.

enter image description here

Wie Sie sehen, ist time_zone_id als GMT-07 gespeichert: 00, aber einmal vom Nov Kick-in Sommer 5, muss es GMT-08: 00. oder sonst wird mein Quarz-Job eine Stunde früher feuern. In der Tat, wenn ich für Abfrage nextFireTime, ich 1510794000000 bekommen, welche Mittwoch in der Tat ist 15. November 2017 17.00.00 (pm) in der Zeitzone America/Los Angeles (PST)

wie wir es tun Behandle dieses time_zone_id-Problem?

S.S: Ich benutze CronTrigger, die nicht den Begriff preserveHourOfDayAcrossDaylightSavings hat, der von CalendarIntervalTrigger zur Verfügung gestellt wird.

Antwort

1

Verwenden Sie keinen Offset, um die Zeitzone darzustellen. Stattdessen können Sie den Benutzer bitten, eine Zeitzone wie "America/Los_Angeles" einzugeben. Dann können Sie http://www.quartz-scheduler.org/api/2.2.1/org/quartz/CronScheduleBuilder.html#inTimeZone(java.util.TimeZone) verwenden, um Trigger mit der richtigen Zeitzone zu erstellen.

inTimeZone(TimeZone.getTimeZone("USER_ENTERED_VALUE") 

Schließlich, wenn Sie bei QRTZ_CRON_TRIGGERS Tabelle schauen, wird der Wert für TIME_ZONE_ID America/Los_Angeles

Verwandte Themen