在AChat項(xiàng)目的開(kāi)發(fā)過(guò)程中荤西,項(xiàng)目要求無(wú)論終端是什么時(shí)區(qū)設(shè)置伟桅、地處何方,終端的時(shí)間是否正確越驻,post到服務(wù)器的數(shù)據(jù)包里面的時(shí)間字段均要求跟服務(wù)器同步汁政,也就是說(shuō),用戶買來(lái)一部新手機(jī)缀旁、新平板记劈,不做任何日期時(shí)間、時(shí)區(qū)方面的設(shè)置并巍,裝了App就用目木,也能讓時(shí)間數(shù)據(jù)正確。
? ? ? ? ? 我是這樣設(shè)計(jì)的懊渡,在app的setting中有3個(gè)變量org_tablet_tm刽射,org_server_tm和server_timezone军拟,App啟動(dòng)的時(shí)候,即聯(lián)線服務(wù)器取回當(dāng)時(shí)的時(shí)間和服務(wù)器所在時(shí)區(qū)分別保存在org_server_tm和server_timezone誓禁,同一刻懈息,取終端的時(shí)間保存在org_tablet_tm。
? ? ? ? ? 定義now()函數(shù)摹恰,此函數(shù)取當(dāng)前設(shè)備時(shí)間再加上org_server_tm-org_tablet_tm的差值辫继。
好了,這時(shí)候盡管設(shè)備終端的時(shí)間亂七八糟俗慈,只要時(shí)區(qū)跟服務(wù)器時(shí)區(qū)一致姑宽,用now()函數(shù)即可獲得服務(wù)器上此時(shí)此刻的時(shí)間。
? ? ? ? 但是闺阱,問(wèn)題來(lái)了炮车,每個(gè)用戶的終端設(shè)備時(shí)區(qū)不一定跟服務(wù)器上的一致,有可能他們根本沒(méi)調(diào)時(shí)間酣溃、或沒(méi)勾上自動(dòng)同步時(shí)間示血,這時(shí)候需要我們用代碼實(shí)現(xiàn)在終端不同時(shí)區(qū)也能跟服務(wù)器上的時(shí)間同步。
? ? ? ? 先看看這個(gè)DateTimeConvertToServer這個(gè)函數(shù)救拉,先從tm中減去當(dāng)前時(shí)區(qū)跟格林威治之間的時(shí)間差,再加上服務(wù)器所在時(shí)區(qū)跟格林威治時(shí)間差瘫拣,即可算出到服務(wù)器時(shí)間:
再看getDiffTimeZoneRawOffsetStd函數(shù)亿絮,用于計(jì)算指定時(shí)區(qū)跟格林威治時(shí)區(qū)的時(shí)間差(毫秒):
我在參數(shù)里面配置一個(gè)選項(xiàng)”是否轉(zhuǎn)換成終端時(shí)間“,若轉(zhuǎn)換麸拄,則什么都不做派昧,因?yàn)锳ndroid系統(tǒng)能根據(jù)當(dāng)前設(shè)置的時(shí)區(qū)自動(dòng)轉(zhuǎn)換時(shí)間,若不轉(zhuǎn)換拢切,則顯示服務(wù)器端時(shí)間蒂萎,則需要用DateTimeConvertToServer函數(shù)轉(zhuǎn)換一下。
補(bǔ)充一下截圖淮椰,當(dāng)前平板時(shí)間亂套五慈,時(shí)區(qū)是巴庫(kù)asia/baku,服務(wù)器是東8區(qū)主穗,下面是平板截圖:
服務(wù)器上保存的數(shù)據(jù):
==================================
? ? ? ? ? 完結(jié)前吐槽一下泻拦,網(wǎng)絡(luò)上流傳一段時(shí)區(qū)差的計(jì)算函數(shù),它們用TimeZone的getRawOffset忽媒,當(dāng)時(shí)我也抄來(lái)用争拐,各種時(shí)區(qū)試一遍,開(kāi)始是各種適合晦雨,但測(cè)試到Asia/Baku時(shí)頓時(shí)石化了架曹,同樣是東5區(qū)的卡拉奇隘冲、烏拉爾都沒(méi)問(wèn)題,自巴庫(kù)起開(kāi)始一路往西的時(shí)區(qū)都相差一小時(shí)0笮邸U勾恰!用getRawOffset獲得巴庫(kù)離格林威治差4小時(shí)绳慎,但應(yīng)該是5小時(shí)W菔!由于時(shí)間問(wèn)題沒(méi)仔細(xì)分析什么原因杏愤,有空再看并靡砌。
==================================
? 然而更狗血的事件發(fā)生了,在公司做的一批平板上運(yùn)行APP,發(fā)現(xiàn) android 4.2的老平板, 默認(rèn)的American/New York按上述方法轉(zhuǎn)為服務(wù)器的東8區(qū)時(shí)間問(wèn)題要快1小時(shí), 在android 4.4.2上則沒(méi)有這個(gè)問(wèn)題!? 后來(lái)調(diào)試發(fā)現(xiàn)American/New York時(shí)區(qū)在這平板上相差GMT -5 ! 而在我的華為手機(jī)上為GMT -4!
? 不明白為什么會(huì)這樣! 但換另一種做法,就是設(shè)置平板默認(rèn)與服務(wù)器上的相同無(wú)需手動(dòng)計(jì)算差值,則所有問(wèn)題得到解決: