10年 Java程序员,硬核人生!勇往直前,永不退缩!

欢迎围观我的git:https://github.com/R1310328554/spring_security_learn 寻找志同道合的有志于研究技术的朋友,关注本人微信公众号: 觉醒的码农,或Q群 165874185

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

神奇bug, Timestamp 会四舍五入也会引起 bug .. 

String UUID = java.util.UUID.randomUUID().toString();
long time = System.currentTimeMillis() + 30 * 60 * 1000;
Timestamp outDate = new Timestamp(time);
long outDateLong = time/1000*1000;
user.setValidateUuid(UUID);
user.setOutDate(outDate);
userMapper.updateByPrimaryKey(user);

这段代码有问题吗? 

 

其实是有的, time / 1000 * 1000 之后, time 相对于失去了 尾数后面3个数字, 也就是 直接截断了. 但是, outDate 并没有, outDate 保存的mysql 数据库里面的时候, 也会截断吗?  如果也是截断, 那么就不会有任何问题. 但是, 经测试 实际不是的, 它会四舍五入 ..

如果time 末尾三位数小于500, 那么也没有问题, 如果大于, 就出现bug了, 后面如果再次从数据库获取 outDate, 那么其毫秒值会 不等于outDateLong  ,  刚好出现几率为 0.5 的bug 啊!!   ( 当然, 如果不关心outDateLong , 其实也没有什么问题, 谁会去关心那个秒级的四舍五入呢?)

 

 

改成下面的样子就好了..

String UUID = java.util.UUID.randomUUID().toString();
long time = System.currentTimeMillis() + 30 * 60 * 1000;
long outDateLong = time/1000*1000;
Timestamp outDate = new Timestamp(outDateLong);
user.setValidateUuid(UUID);
user.setOutDate(outDate);
userMapper.updateByPrimaryKey(user);

..

 

posted on 2018-07-20 11:49  CanntBelieve  阅读(1081)  评论(0编辑  收藏  举报