2017-11-04 9 views
0

私のサービスapiは、ジョブが実行されるために、クォーツのジョブと月の開始日を取ります。 内部的には、これをcron式に変換してクォーツで保存します。cronトリガ用のクォーツの夏時間のユーザタイムゾーンを処理する方法は?

たとえば、PSTのユーザーは、今日(2017年11月3日)ジョブリクエストを次のように送信します。

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

ここで、2017-11-03から開始して、午後6時に毎月15日に発生するジョブをスケジュールしたいとします。最初の石英は2017-11-15年になるでしょう。 これは上記の要求がcron式0 0 18 15 * ? *に変換される方法です。これは正しいです。 QRTZ_CRON_TRIGGERSテーブルは次のようになります。

enter image description here

あなたが気づくと、time_zone_idはGMT-07として保存される:00、しかし、夏時間がキックに一度11月5日に、それはGMT-08でなければならない:00。さもなければ私の石英の仕事は一時間早く消火するでしょう。私はnextFireTimeを照会するとき、実際には、私たちはどのように行う確かである1510794000000 タイムゾーンアメリカ/ロサンゼルス水曜日2017年11月15日17時00分00秒(午後)(PST)

を得るのですかこのtime_zone_idの問題を処理しますか?

P.S:で提供されるpreserveHourOfDayAcrossDaylightSavingsの概念を持たないcronTriggerを使用しています。

答えて

1

タイムゾーンを表すためにオフセットを使用しないでください。むしろ、ユーザーに "America/Los_Angeles"のようなタイムゾーンで渡すように求めることができます。次に、http://www.quartz-scheduler.org/api/2.2.1/org/quartz/CronScheduleBuilder.html#inTimeZone(java.util.TimeZone)を使用して、適切なタイムゾーンでトリガーを作成できます。あなたはQRTZ_CRON_TRIGGERSテーブルを見ると

inTimeZone(TimeZone.getTimeZone("USER_ENTERED_VALUE") 

最後に、TIME_ZONE_IDの値はアメリカ/ Los_Angelesになります

関連する問題