2015-01-30 10 views
2

Я ищу способ преобразования выражения cron из одного часового пояса в другой часовой пояс.

Например, мой пользователь веб-клиента GMT + 1200, а мой сервер - GMT + 0800, а пользовательский параметр 02:10 для выполнения задачи каждый вторник и четверг, выражение cron будет «0 10 2 3, 5 *?», и я использовал код, как показано ниже, он может получить текущее время пожара на часовом поясе пользователя

Преобразование выражения cron из одного часового пояса в другое

 CronExpression expr = new CronExpression("0 10 2 3,5 * ?"); 

     System.out.println(expr.getNextValidTimeAfter(new Date())); 
     System.out.println(expr.getTimeZone()); 
     System.out.println(expr.getExpressionSummary()); 
     System.out.println("======="); 
     TimeZone tz = TimeZone.getTimeZone("GMT+1200"); 
     expr.setTimeZone(tz); 
     System.out.println(expr.getNextValidTimeAfter(new Date())); 
     System.out.println(expr.getTimeZone()); 
     System.out.println(expr.getExpressionSummary()); 

getNextValidTimeAfter напечатает пн Фев 02 22:10:00 CST 2015, который после setTimeZone (tz); однако getExpreesionSummary или даже getCronExpression() все равно будет «0 10 2 3,5 *?», где я хочу получить строку будет «0 10 22 2,4 *?» и затем я могу сохранить в БД для следующего пожара времени, а также другого пользователя часового пояса для запроса настройки (из-за этого ему нужно будет преобразовать «0 10 22 2,4 *?» в часовой пояс этого пользователя)

Любая помощь оценивается

+0

У вас есть решение для этого? У меня тоже такая же проблема. –

+0

@JyotiRanjan, я до сих пор не нашел для этого решения. Я сделал разговор вручную. – Bruce

+0

хорошо, я дам вам знать, найду ли что-нибудь или код для этого преобразования в java. В моем случае, если это делается js/jquery, то и это нормально. –

ответ

0

Если вы желаете сохранить одно и то же выражение cron, но дайте контекстные вычисления, основанные на дате часовой пояс (чтобы пользователь и серверы получили следующее исполнение на основе их часовых поясов для того же выражения), вы можете использовать cron-utils, который предоставляет такие функциональность. Все вычисления следующего/предыдущего исполнения являются контекстуальными для часового пояса, начиная с версии 3.1.1.

Они обеспечивают пример в документации:

//Get date for last execution 
DateTime now = DateTime.now(); 
ExecutionTime executionTime = ExecutionTime.forCron(parser.parse("* * * * * * *")); 
DateTime lastExecution = executionTime.lastExecution(now)); 

//Get date for next execution 
DateTime nextExecution = executionTime.nextExecution(now)); 

значение nextExecution будет рассчитываться по той же временной зоны в качестве базовой даты (в настоящее время).

Смежные вопросы