我正在寻找一种将 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));
nextExecution 值将在与参考日期(现在)相同的时区计算。
您可以尝试一下:https://github.com/VidocqH/cron-timezone-convert
安装crontzconvert
pip3 install crontzconvert
使用它
import crontzconvert
print(crontzconvert.convert('5 13 * * 3', 'Etc/GMT-3', 'Etc/UTC'))