問題點
越來越多的業(yè)務(wù)場景需要根據(jù)服務(wù)器時間進(jìn)行本地的展示滑燃,就有了這樣這樣一些問題:
a. 服務(wù)器時間接口頻繁調(diào)用贞铣。使用服務(wù)器時間的業(yè)務(wù)模塊較多時,每次使用都要調(diào)用一次服務(wù)器時間接口扳碍;
b. 業(yè)務(wù)阻斷本今。調(diào)用服務(wù)器時間期間拆座,本地業(yè)務(wù)展示需等待服務(wù)端時間接口調(diào)用;
c. 服務(wù)端時間接口調(diào)用時的時間消耗冠息。在調(diào)用服務(wù)器時間接口時存在網(wǎng)絡(luò)上挪凑,以及服務(wù)器處理的時間消耗。
如何在誤差允許范圍內(nèi)優(yōu)化這些問題逛艰?
優(yōu)化方案
現(xiàn)考慮如下一種優(yōu)化方案:
- 服務(wù)器時間接口頻繁調(diào)用和業(yè)務(wù)阻斷躏碳。在APP啟動時,調(diào)用服務(wù)端時間接口瓮孙,計算服務(wù)端時間接口和本地時間差值唐断,在使用服務(wù)器時間時根據(jù)差值和本地時間計算實際的服務(wù)器時間。
-
服務(wù)端時間接口調(diào)用時的時間消耗杭抠。參考NTP協(xié)議脸甘,可以優(yōu)化這個問題。
NTP原理如下:
1096626509281939420.jpg
系統(tǒng)時鐘同步的工作過程如下:
Device A發(fā)送一個NTP報文給Device B偏灿,該報文帶有它離開Device A時的時間戳丹诀,該時間戳為10:00:00am(T1)。
當(dāng)此NTP報文到達(dá)Device B時翁垂,Device B加上自己的時間戳铆遭,該時間戳為11:00:01am(T2)。
當(dāng)此NTP報文離開Device B時沿猜,Device B再加上自己的時間戳枚荣,該時間戳為11:00:02am(T3)。
當(dāng)Device A接收到該響應(yīng)報文時啼肩,Device A的本地時間為10:00:03am(T4)橄妆。
至此,Device A已經(jīng)擁有足夠的信息來計算兩個重要的參數(shù):
NTP報文的往返時延Delay=(T4-T1)-(T3-T2)=2秒祈坠。
Device A相對Device B的時間差offset=((T2-T1)+(T3-T4))/2=1小時害碾。
存在的問題
如果用戶切到后臺修改了本地時間,或者通過其他方式同步了客戶端時間赦拘,會造成最終獲取到的時間存在誤差慌随。
可采用如下兩種方式進(jìn)行優(yōu)化:
- 監(jiān)聽時間修改;
- 使用SystemClock.elapsedRealtime()。SystemClock.elapsedRealtime()獲取的時間時從手機boot后到現(xiàn)在的時間阁猜,跟系統(tǒng)時間設(shè)置無關(guān)丸逸。