问题背景
团队规定:服务端对外接口无论是接收还是返回,对于时间都是要时间戳,且毫秒格式,内部数据库存储建议BIGINT,而有人用了DateTime,导致了线上一个对接业务出现了时间戳校验失败的BUG。
BUG复现
- 外部接口首先请求接口A(
实现了幂等
),传了一个毫秒级别的时间戳和其他业务参数,如1538284559999
(北京时间2018-09-30 13:15:59.999),; - 系统接收到参数后,将时间戳转换为Date类型,存入数据库;
- 外部接口再次调用接口A,传了相同的参数,包括时间戳
1538284559999
,返回错误,而非期望的幂等成功。
BUG定位
经过查看日志等工作,发现mysql在存储1538284559999
时进行了四舍五入,成了2018-09-30 13:16:00
,系统再次拿出该时间戳时就成了1538284560000
,这!根本没法对比啊!
为什么呢?
为什么mysql会对毫米级时间戳进行四舍五入呢?正常来说,无论是DateTime还是Timestamp,都可以存储毫秒级别的时间,于是搜索了一番,查找到一个