1. 程式人生 > >APP(Android版)客戶端與伺服器端時間校準

APP(Android版)客戶端與伺服器端時間校準

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);