最近公司提了个需求,要求在每半小时执行一次定时任务,根据时间节点,每半点查询一次数据库。
egg:2018-11-14 11:30:00
一开始的做法:
private final static long halfHour = 30 * 60 * 1000;
long time = System.currentTimeMillis();
time += halfHour;
Date systemDate = new Date(time);
这样得出来的数据,直接打印在控制台是
Wed Nov 14 11:30:00 CST 2018
测试的时候因为没有办法获取整半点的时间,就通过SimpleDateFormat坐了下来转换
String str = "2018-11-14 11:30:00";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parse = simpleDateFormat.parse(str);
通过上述转换,测试时可以准确的查到数据库的信息。这样把定时任务封装好后,时间一到,尴尬了,数据库查询出来的数据为空。于是查询日志,打印出来的时间同样是 Wed Nov 14 11:30:00 CST 2018。
仔细看了一遍代码后发现,System.currentTimeMillis();该方法获取的是当前系统时间,精确到毫秒级。打开Debug,在撸了一遍程序,日志看出,获取的时间戳为整半点的之后几十毫秒!!!
难道是因为这几十毫秒影响了我的查询结果吗?带着疑问,将获取的时间通过SimpleDateFormat进行转换。
private final static long halfHour = 30 * 60 * 1000;
long time = System.currentTimeMillis();
time += halfHour;
Date systemDate = new Date(time);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(systemDate);
Date date = simpleDateFormat.parse(format);
这样转换过来的时间,忽略了毫秒,精度在秒上,等于是没有了那几十毫秒到的误差。
于是封装代码,再撸一遍。结果显示可以正确查到数据库的信息。对了,mapper映射文件该字段别忘了加上jdbcType=TIMESTAMP。
还有一个遗留问题,关于控制台打印信息两次一样的结果问题,是因为Date类型直接做了类型转换,精确度不显示毫秒。