最近需要使用cron表达式定期执行任务,因此使用到了CronExpression,对cron表达式进行解析,来获取下一次的执行时间。此处我使用的是org.drools.core.time.impl.CronExpression。
结果遇到了一个很坑的问题:
我想写一个解析demo,调试解析情况,但是发现输入的cron表达式,与输出的解析后的时间不符。。。。。。>_<
public static void main(String[] args) {
try {
long now = System.currentTimeMillis();
CronExpression cronExpression = new CronExpression("0 0 12 * * ?");
System.out.println(DateUtils
.format(cronExpression.getNextValidTimeAfter(new Date(now)), "yyyy-MM-dd hh:mm:ss"));
} catch (ParseException e) {
e.printStackTrace();
}
}
按照上面的cron表达式:“0 0 12 * * ?” 来说,由于执行时已经过了当天的12点了,应该输出的时间是:下一天的12点整,结果:
这件事情很莫名其妙。。。。。。但是看到时间会发现,和预期的时间正好差了8小时,这让人容易联想到TimeZone,看了下内部源码:
public Date getNextValidTimeAfter(Date date) {
return this.getTimeAfter