测试踩坑——JAVA13位时间戳处理,别小瞧了“毫秒“老弟
Posted One Tester
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试踩坑——JAVA13位时间戳处理,别小瞧了“毫秒“老弟相关的知识,希望对你有一定的参考价值。
测试踩坑——JAVA13位时间戳处理,别小瞧了"毫秒"老弟!
您好,我是博主 One Tester ,感谢您阅读本文!如果此文对您有所帮助,请毫不犹豫的一键三连吧,小伙伴们有想看的欢迎积极留言。测试相关博客链接已存放在改链接下:汇总目录
一、BUG现象
BUG现象
:进入页面,显示的下周还有剩余的流量额度,但是将营销时间选择在下周的时间里,点击 “完成创建”按钮进行任务创建的时候,却提示“任务渠道余额不足”(这里只要时间范围内有剩余,就能创建)。
场景描述
:
- 页面查询时:传入
当前时间
,计算出本周时间范围和下周时间范围,然后根据范围计算出相关数据 - 创建任务时:传入
选择的营销时间
,计算出运营时间当周时间范围和下周时间范围,然后根据范围计算出相关数据。
二、BUG原因及修复
问题原因
:开发写了两个方法,入参都为Date时间。一个计算入参对应周的开始时间,另一个计算对应周的结束时间,但是计算对应周开始时间中存在问题。
-
创建任务时,选择时间只是年月日,所以最后传递过去的13位时间戳,后三位的毫秒数肯定是0。
-
进入创建任务界面,查询时,由于传递的是当前时间,对应的13位时间戳的后三位肯定不为0。
导致的问题
:由于两种场景计算出来的时间不一致,而对应查询数据的SQL就会不一致(mysql中between是前闭后闭区间[])。
- 创建任务(正常情况): market_time BETWEEN ‘2021-06-21 00:00:00’ AND ‘2021-06-27 23:59:59.999’
- 查询信息(异常情况):market_time BETWEEN ‘2021-06-21 00:00:00.387’ AND ‘2021-06-27 23:59:59.999’
而如果存在运营时间是周一的数据,就会导致两个sql查询出来数据必然不一致的情况。
开发原先计算当前时间本周的时间范围开始时间的代码如下:
public static Date getMondayOfCurrentWeek(Date date)
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
dayOfWeek = 7;
cal.add(Calendar.DATE, 1 - dayOfWeek);
return clearTime(cal.getTime());
代码修复
: 将clearTime方法中,将毫秒级别的时间也设置为0
三、排查过程——Debug没细看后的迷惑操作
迷惑操作
:正常情况而言,这个时间戳的问题,正常Debug就能发现问题所在。But,我当时debug时,硬生生就是没有展开看那个时间戳(就这样被蒙蔽了双眼…),只看到两种场景显示的开始时间和结束时间对应的年月日-时分秒都一样(如下图),当时就懵了,这代码没问题啊,这时间也没问题,这怎么可能有问题,难道中邪了…最后想只能捞一下这两种情况对应的sql看下有啥区别。
3.1 使用tcpdump,获取对应cap数据包
- 使用CRT或Xsehll工具,连接上这个SQL 所属域。
- 通过以下命令,可以监听对应的tcp流数据并将cap数据文件下载到本地。
- 注意点1:为了避免监听的tcp数据量中包含太多的mysql相关的数据,导致后面不好找到对应的数据。可以将Debug远程服务,将断点打在需要查看的SQL前后各一个,到第一个断点时,使用tcpdump命令开始监听,到第二个断点时,结束监听并生成文件
- 注意点2:CRT软件一般会设置默认下载路径,可能sz命令时不会出现选择将文件下载到那个目录下的选项。
对应命令
:sudo su - root yum install tcpdump tcpdump -i eth0 -s0 -w ~/123.cap sz 123.cap
3.2 使用Wireshark解析数据包,查看mysql语句
解压版安装
:https://download.csdn.net/download/qq_37688023/79821541
-
直接将生成的.cap文件拖动到Wireshark打开
-
输入mysql,过滤出mysql相关的数据
-
选择其中一个,右键选择→追踪流→TCP流
-
最后就能看到对应的SQL语句了
以上是关于测试踩坑——JAVA13位时间戳处理,别小瞧了“毫秒“老弟的主要内容,如果未能解决你的问题,请参考以下文章