将cron表达式从一个时区转换为另一个时区

时间:2015-01-30 02:39:35

标签: java cron timezone timezone-offset cronexpression

我正在寻找将cron表达式从一个时区转换为另一个时区的方法。

例如,我的网络客户端用户是GMT + 1200,我的服务器端是GMT + 0800,而用户设置02:10每周二和周四执行任务,cron表达式将是" 0 10 2 3, 5 *?",我使用了如下代码,它可以获得用户当前的开机时间

        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将打印在2015年2月2日22:10:00 CST 2015之后,在setTimeZone(tz);之后,但getExpreesionSummary甚至getCronExpression()仍将是" 0 10 2 3,5 *?& #34;,我想要得到的字符串将是" 0 10 22 2,4 *?"然后我可以保存到DB以供下次使用以及另一个时区用户查询设置(原因是这需要转换为" 0 10 22 2,4 *?"此用户' ; s时区)

感谢任何帮助

1 个答案:

答案 0 :(得分: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值将计算为与参考日期(现在)相同的时区。