問題描述
系統平臺查詢車輛軌跡資料分為兩種方式:頁面查詢方式、對外介面方式
透過頁面查詢方式顯示的資料定位時間是符合實際情況的,而透過對外介面查詢的資料定位時間卻比實際時間早了八個小時
解決方案
透過分析兩個後端介面業務邏輯程式碼,發現底層呼叫的是同一段程式碼,即說明從資料庫中查詢出的資料是一致的
而這兩段業務邏輯的區別在於對時間戳的解析:
- 平臺頁面是將時間戳傳遞給前端,讓前端解析
- 後端對外介面是直接解析完再返回
故結合實際車輛執行情況,定位問題為後端對外介面的時間戳解析函式有問題
// 原業務解析函式
// 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容器時間是否準確
- 業務程式碼中相關函式時區問題