2017-11-04 1 views
0

내 서비스 api는 석영을위한 startDate를 취하고 실행될 작업에 대한 월 및 일을 취합니다. 내부적으로 이것을 cron 표현식으로 변환하고 석영으로 저장합니다.cron 트리거의 석영에서 일광 절약 시간제 사용자 시간대를 처리하는 방법은 무엇입니까?

예를 들어 PST 사용자는 오늘 (2017 년 11 월 3 일) 다음과 같이 작업 요청을 제출합니다.

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

다음은 사용자가 2017년 11월 3일부터 오후 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 에 대한 쿼리 할 때 사실, 나는 우리가 어떻게 실제로 시간대 미국/로스 앤젤레스 2017년 11월 15일 17시 0분 0초 (오후) (PST)

수요일 인 1,510794000000을받을 수 있나요 이 time_zone_id 문제를 해결 하시겠습니까?

P .: CalendarIntervalTrigger에 의해 제공되는 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의 값은 미국/로스 엔젤레스 될 것