记一次关于使用Date类型查询的毫秒级误差

本文探讨了在实现每半小时执行一次的定时任务中遇到的毫秒级时间误差问题,详细介绍了如何通过调整时间戳处理方式,使用SimpleDateFormat忽略毫秒级差异,确保数据库查询的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近公司提了个需求,要求在每半小时执行一次定时任务,根据时间节点,每半点查询一次数据库。

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类型直接做了类型转换,精确度不显示毫秒。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值