APP(Android版)客戶端與伺服器端時間校準
阿新 • • 發佈:2018-12-04
APP開發人員經常會遇見一個bug就是,APP顯示的時間不準,或者說APP時間與伺服器時間不一致,會導致資料請求、資料顯示等各種問題。這時候我們就需要一種機制來解決時間不一致的問題。
解決方案如下:
1.伺服器端永遠使用UTC時間,包括引數和返回值,不要使用Date格式,而是使用UTC時間1970年1月1日的差值,即long型別的長整數。
2.APP端將伺服器返回的long型時間轉換為GMT8時區的時間,額外加上8小時,這樣就保證了無論使用者在哪個時區,他們看到的時間都是同一個時間,也就是GMT8的時間。
3.APP本地時間會不準,少則差幾分鐘,多則十幾分鍾,要解決這個問題,我們可以使用HTTP Response頭的Date屬性,每次呼叫伺服器介面時就取出HTTP Response頭的Date值,轉換為GMT時間,再減去本地取出的時間,得到一個差值d,我們將這個差值d儲存下來。每次獲取本地時間的時候,額外加上這個差值d,就得到了伺服器的GMT8時間,就保證了任何人看見的時間都是一樣的。
/** * 獲取差值 **/ private long getDeltaBetweenServerAndClientTime(Headers headers) { long deltaBetweenServerAndClientTime=0; if (headers!=null) { final String strServerDate = headers.get("Date"); if (!TextUtils.isEmpty(strServerDate)){ final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.ENGLISH); TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); try { Date serverDate = simpleDateFormat.parse(strServerDate); deltaBetweenServerAndClientTime = serverDate.getTime()-System.currentTimeMillis(); } catch (ParseException e) { e.printStackTrace(); } } } return deltaBetweenServerAndClientTime; }
使用時加上差值:
Date serverTime = new Date(System.currentTimeMillis()+deltaBetweenServerAndClientTime);