I think I found a solution, tested and works until proven otherwise;)
RECUP My server runs in a specific time zone (i.e. In Europe / Rome)
If a user in Pacific / Honolulu TZ wants to schedule work that starts on Sun, January 27, 2013 at 15:00 ends at Thu, January 31, 2013 at 9:00 pm, which fires every day every five minutes, starting at 2: 00:00 - 22:55 (0 0/5 14-22 * *?) The correct way:
- set user timezone in inTimeZone method to CronScheduleBuilder
- adapt to server time startAt and endAt dates by moving from the Pacific / Honolulu to Europe / Rome.
Code example:
// Begin User Input String userDefinedTZ = "Pacific/Honolulu"; // +11 int userStartYear = 2013; int userStartMonth = Calendar.JANUARY; int UserStartDayOfMonth = 27; int userStartHour = 15; int userStartMinute = 0; int userStartSecond = 0; int userEndYear = 2013; int userEndMonth = Calendar.JANUARY; int UserEndDayOfMonth = 31; int userEndHour = 21; int userEndMinute = 0; int userEndSecond = 0; // End User Input Calendar userStartDefinedTime = Calendar.getInstance(); // set start schedule by user input userStartDefinedTime.set(userStartYear, userStartMonth, UserStartDayOfMonth, userStartHour, userStartMinute, userStartSecond); Calendar userEndDefinedTime = Calendar.getInstance(); // set end schedule by user input userEndDefinedTime.set(userEndYear, userEndMonth, UserEndDayOfMonth, userEndHour, userEndMinute, userEndSecond); CronTrigger trigger = newTrigger() .withIdentity("name", "group") .withSchedule( // define timezone for the CronScheduleBuilder cronSchedule("0 0/5 14-22 * * ?").inTimeZone(TimeZone.getTimeZone("Pacific/Honolulu")) ) // adapt user start date to server timezone .startAt( convertDateToServerTimeZone(userStartDefinedTime.getTime(), userDefinedTZ) ) // adapt user end date to server timezone .endAt( convertDateToServerTimeZone(userEndDefinedTime.getTime(), userDefinedTZ) ) .build();
A utility for converting dates based on tz:
public Calendar convertDateToServerTimeZone(Date dateTime, String timeZone) { Calendar userDefinedTime = Calendar.getInstance(); userDefinedTime.setTime(dateTime); if(!TimeZone.getDefault().getID().equalsIgnoreCase(timeZone)) { System.out.println ("original defined time: " + userDefinedTime.getTime().toString() + " on tz:" + timeZone); Calendar quartzStartDate = new GregorianCalendar(TimeZone.getTimeZone(timeZone)); quartzStartDate.set(Calendar.YEAR, userDefinedTime.get(Calendar.YEAR)); quartzStartDate.set(Calendar.MONTH, userDefinedTime.get(Calendar.MONTH)); quartzStartDate.set(Calendar.DAY_OF_MONTH, userDefinedTime.get(Calendar.DAY_OF_MONTH)); quartzStartDate.set(Calendar.HOUR_OF_DAY, userDefinedTime.get(Calendar.HOUR_OF_DAY)); quartzStartDate.set(Calendar.MINUTE, userDefinedTime.get(Calendar.MINUTE)); quartzStartDate.set(Calendar.SECOND, userDefinedTime.get(Calendar.SECOND)); quartzStartDate.set(Calendar.MILLISECOND, userDefinedTime.get(Calendar.MILLISECOND)); System.out.println("adapted time for " + TimeZone.getDefault().getID() + ": " + quartzStartDate.getTime().toString()); return quartzStartDate; } else { return userDefinedTime; } }
== START UPDATES 2012-01-24 ==
Quartz Based Utility for tz-based date conversion using DateBuilder :
public Calendar convertDateToServerTimeZone(Date dateTime, String timeZone) { Calendar userDefinedTime = Calendar.getInstance(); userDefinedTime.setTime(dateTime); if(!TimeZone.getDefault().getID().equalsIgnoreCase(timeZone)) { System.out.println("original defined time: " + userDefinedTime.getTime().toString() + " on tz:" + timeZone); Date translatedTime = DateBuilder.translateTime(userDefinedTime.getTime(), TimeZone.getDefault(), TimeZone.getTimeZone(timeZone)); Calendar quartzStartDate = new GregorianCalendar(); quartzStartDate.setTime(translatedTime); System.out.println("adapted time for " + TimeZone.getDefault().getID() + ": " + quartzStartDate.getTime().toString()); return quartzStartDate; } else { return userDefinedTime; } }
== END OF UPDATE 2012-01-24 ==
So, on my Europe / Rome Quartz server, this work is scheduled for Monday from January 28, 02:00:00 CET 2013 to Friday February 1, 08:00:00 CET 2013 and fire every five minutes every day from 01:00 to 20 : 55
When creating your dates for beginning and ending time, also specify the time zone (in java.util.Calendar, or the date format or org.quartz.DateBuilder) before creating the date. The quartz then stores the date in milliseconds from January 1, 1970 in UTC in that particular time zone - and therefore, when the serverβs time zone changes, the trigger does not affect.