時區問題導致時間相差8個小時

成佛在西天發表於2024-03-14

問題描述

系統平臺查詢車輛軌跡資料分為兩種方式:頁面查詢方式、對外介面方式

透過頁面查詢方式顯示的資料定位時間是符合實際情況的,而透過對外介面查詢的資料定位時間卻比實際時間早了八個小時

解決方案

透過分析兩個後端介面業務邏輯程式碼,發現底層呼叫的是同一段程式碼,即說明從資料庫中查詢出的資料是一致的

而這兩段業務邏輯的區別在於對時間戳的解析:

  • 平臺頁面是將時間戳傳遞給前端,讓前端解析
  • 後端對外介面是直接解析完再返回

故結合實際車輛執行情況,定位問題為後端對外介面的時間戳解析函式有問題

// 原業務解析函式
// 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容器時間是否準確
  • 業務程式碼中相關函式時區問題

相關文章