背景
负责修改的模块有一个实时工况功能,根据时间排序查询数据,处理后返回给前台做图表展示。测试的时候同事发现了图表中经常有数据非常突兀,本来平滑的图表变成了T字形
问题排查
查看数据发现其他格式都是’yyyy-MM-dd HH:mm:ss’,而有问题的数据为’yyyy-MM-ddTHH:mm’。这里其实数据都是这种带T的,只把’yyyy-MM-ddTHH:mm:ss’的数据转换为正常格式的数据。但是有问题的数据是没有秒的,所以我转换的时候抛出转换异常,然后展示为原来的格式。因为排序时字母T比空格顺序靠后,所以即使这些数据的小时值为6点,7点,也要比23点的数据靠后,造成了T数据的形成
我以为是硬件的问题,跟同事反应后回复说硬件传的是二进制。突然想起来这个功能是我根据二进制自己截取字节拼接的时间,于是查看代码,如下
LocalDateTime time = LocalDateTime.of(getUint8(data[offset]) + 2000, month, day,
getUint8(data[offset + 3]), getUint8(data[offset + 4]), getUint8(data[offset + 5]));
我根据与硬件协议规定的字节去使用LocalDateTime
来转换时间,最后使用toString()
方法转换为字符串,看来是如果秒为0的话,那么转换的格式就为‘yyyy-MM-ddTHH:mm’,而不是’yyyy-MM-dd-dd-THH:mm:ss’
解决办法
知道问题所在就好办了,使用DateTimeFormatter进行强制格式转换即可,代码如下
LocalDateTime time = LocalDateTime.of(getUint8(data[offset]) + 2000, month, day,
getUint8(data[offset + 3]), getUint8(data[offset + 4]), getUint8(data[offset + 5]));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String time = time.format(formatter))