问题描述
系统平台查询车辆轨迹数据分为两种方式:页面查询方式、对外接口方式
通过页面查询方式显示的数据定位时间是符合实际情况的,而通过对外接口查询的数据定位时间却比实际时间早了八个小时
解决方案
通过分析两个后端接口业务逻辑代码,发现底层调用的是同一段代码,即说明从数据库中查询出的数据是一致的
而这两段业务逻辑的区别在于对时间戳的解析:
- 平台页面是将时间戳传递给前端,让前端解析
- 后端对外接口是直接解析完再返回
故结合实际车辆运行情况,定位问题为后端对外接口的时间戳解析函数有问题
// 原业务解析函数
// resp.setGpstime(DateFormatUtils.format(dp.getCurrenttime(),"yyyy-MM-dd HH:mm:ss"));
// 设置中国上海时区
resp.setGpstime(DateFormatUtils.format(dp.getCurrenttime(),"yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("Asia/Shanghai")));
// 设置美国纽约时区(比中国早12个小时)
// resp.setGpstime(DateFormatUtils.format(dp.getCurrenttime(),"yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("America/New_York")));
// 设置英国伦敦时区 (比中国早8个小时)
// resp.setGpstime(DateFormatUtils.format(dp.getCurrenttime(),"yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("Europe/London")));
对于时间早(晚)8小时问题一般解决思路
- 查询服务器时间是否准确
- 查询Docker容器时间是否准确
- 业务代码中相关函数时区问题