Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android與服務器通訊:如何保證兩端時間一致性

Android與服務器通訊:如何保證兩端時間一致性

日期:2017/2/23 16:39:53      編輯:關於Android編程

在AChat項目的開發過程中,項目要求無論終端是什麼時區設置、地處何方,終端的時間是否正確,post到服務器的數據包裡面的時間字段均要求跟服務器同步,也就是說,用戶買來一部新手機、新平板,不做任何日期時間、時區方面的設置,裝了App就用,也能讓時間數據正確。

我是這樣設計的,在app的setting中有3個變量org_tablet_tm,org_server_tm和server_timezone,App啟動的時候,即聯線服務器取回當時的時間和服務器所在時區分別保存在org_server_tm和server_timezone,同一刻,取終端的時間保存在org_tablet_tm。

定義now()函數,此函數取當前設備時間再加上org_server_tm-org_tablet_tm的差值。

 

	/**
	 * 永遠以server為准
	 * @return
	 */
	public static Date now(){
		Date w_ret=new Date();		
		w_ret.setTime(w_ret.getTime()+(org_server_tm-org_tablet_tm));
		return w_ret;
	}


 

好了,這時候盡管設備終端的時間亂七八糟,只要時區跟服務器時區一致,用now()函數即可獲得服務器上此時此刻的時間。

 

但是,問題來了,每個用戶的終端設備時區不一定跟服務器上的一致,有可能他們根本沒調時間、或沒勾上自動同步時間,這時候需要我們用代碼實現在終端不同時區也能跟服務器上的時間同步。

先看看這個DateTimeConvertToServer這個函數,先從tm中減去當前時區跟格林威治之間的時間差,再加上服務器所在時區跟格林威治時間差,即可算出到服務器時間:

 

	/***
	 * 把當地的時間轉為服務器當時的時間,一般遞交數據前先把Date一類數據轉換
	 * @param tm
	 * @return
	 */
	public static Date DateTimeConvertToServer(Date tm){
		if (tm==null)return null;
		tm=new Date(tm.getTime()-getDiffTimeZoneRawOffsetStd(TimeZone.getDefault().getID())); //轉成格林威治時間
		Date d=new Date(tm.getTime()+getDiffTimeZoneRawOffsetStd(server_timezone));
		return d;
	}


 

再看getDiffTimeZoneRawOffsetStd函數,用於計算指定時區跟格林威治時區的時間差(毫秒):

 

	/***
	 * 計算出指定時區跟格林威治時間差
	 * @param timeZoneId
	 * @return
	 */
	public static int getDiffTimeZoneRawOffsetStd(String timeZoneId) {		
        //return TimeZone.getTimeZone(timeZoneId).getRawOffset();
		TimeZone tz = TimeZone.getTimeZone(timeZoneId);
	    return tz.getOffset(GregorianCalendar.getInstance(tz).getTimeInMillis());
	}

 

 

 

我在參數裡面配置一個選項”是否轉換成終端時間“,若轉換,則什麼都不做,因為Android系統能根據當前設置的時區自動轉換時間,若不轉換,則顯示服務器端時間,則需要用DateTimeConvertToServer函數轉換一下。

 

補充一下截圖,當前平板時間亂套,時區是巴庫asia/baku,服務器是東8區,下面是平板截圖:

\

 

服務器上保存的數據:

\

 

 

 

==================================

完結前吐槽一下,網絡上流傳一段時區差的計算函數,它們用TimeZone的getRawOffset,當時我也抄來用,各種時區試一遍,開始是各種適合,但測試到Asia/Baku時頓時石化了,同樣是東5區的卡拉奇、烏拉爾都沒問題,自巴庫起開始一路往西的時區都相差一小時!!!用getRawOffset獲得巴庫離格林威治差4小時,但應該是5小時!!由於時間問題沒仔細分析什麼原因,有空再看並。

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved