我正在寻找一种将cron表达式从一个时区转换为另一个时区的方法。
例如,我的 Web 客户端用户是 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
将打印Mon Feb 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 * ?
转换为该用户的时区)
任何帮助不胜感激
如果你愿意保留相同的 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));
next将针对与参考日期(现在)相同的时区计算执行值。
你可以试试:https://github.com/VidocqH/cron-timezone-convert
安装 crontzconvert
pip3 install crontzconvert
使用它
import crontzconvert
print(crontzconvert.convert('5 13 * * 3', 'Etc/GMT-3', 'Etc/UTC'))