編輯:關於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小時!!由於時間問題沒仔細分析什麼原因,有空再看並。
上篇文章主要介紹了Java內存分配相關的知識以及在Android開發中可能遇見的各種內存洩露情況並給出了相對應的解決方案,如果你還沒有看過上篇文章,建議點擊這裡閱讀一下,
本文實例為大家分享了Android二級橫向菜單的實現過程.效果如上圖: 這種橫向的二級菜單在很多的app都有所應用.效果看起來還是非常的美觀的.也
本例使用了6個庫代碼和1個主工程代碼。 一、6個庫代碼如下圖所示: 其中 ①.MenuDrawer、ViewPagerIndi
南周知道 要嚴肅,有知識;要八卦,有內幕。每天一篇,盡享你想知道的和不知道的,我們只想,讓知道成為一種享受。請記住知道,南方周末每日網絡專稿。 1.每天推送一篇你想知道的