2016-11-28 89 views
0

我有一個應用程序嚴重依賴當前時間戳。目前,當用戶提交請求時,我使用System.currentTimeMillis()以UTC獲得當前時間戳。雖然這可以正常工作,但當用戶開始在其設備上操作其Date/Time並導致不準確的時間戳時,就會出現問題。以UTC計時的Android時間同步

爲什麼在客戶端呢?爲什麼不直接在服務器上處理呢?那麼,我的應用程序需要脫機工作。當連接到互聯網不可用時,我的所有請求都被推入jobQueue。在這種情況下,我必須有原來的時間,其中用戶所做的動作,所以如果我在4:02pm提交請求,但由於網絡問題,服務器將只接收它周圍7:30pm,服務器必須知道,我發送請求的4:02pm

現在我已考慮哪些選擇?

  1. 在用戶登錄後,我將設備時間與服務器時間同步,並將該時間存儲在本地。如果在用戶登錄時出現的任何用戶的操作,我將有一個BroadcastReceiver收聽到Date/Time操作的任何意圖,然後存儲偏移,這樣每當用戶提交的請求,我將計算時間同步與偏移確保時間戳準確無誤。
  2. 有一臺服務器同步API在後臺完成,建立了我的應用程序內的服務與服務器時間同步持續向上,並尋找任何漂移,同時監聽到任何用戶操作。
  3. 使用推送通知並監聽下游進行時間同步調整,同時還監聽任何用戶操作。
  4. 我也可以利用NTP服務器與我的設備同步時間。

我不完全確定哪個是最優的(假設我列出了所有可能的解決方案)。如果還有其他解決方案我沒有想到,請讓我知道。

P.S.如果我碰巧使用BroadcastReceiver來聆聽設備上的任何日期時間操縱,那麼我將如何計算該設備的偏移?

+0

使用移動應用程序的本地時區。 – koa73

回答

1

它已經有一段時間,因爲我問了這個問題,並沒有發生過任何優雅的答案,問題,所以經過一番研究和一些試驗和錯誤,我決定走NTP路線經過一番周圍挖,我找到一個不錯的圖書館,爲你做整個事情。

它可以在這裏找到:

NTP TRUE TIME

積分這些傢伙誰取得了生活輕鬆了許多。

必須與NTP服務器只有一次,並從那裏同步,他們會計算三角洲爲我們給我們不管SystemClock時間精確UTC。

0

對於時間同步,您可以實現像從服務器獲取時區。一旦我們有了timzone,我們就可以得到服務器的當前時間。

+0

認真嗎?當我們處理UTC時,我甚至不認爲時區是問題。 –

+0

我的意思是說,如果我們有服務器時區,這意味着我們可以通過使用時區獲得服務器時間?即使沒有網絡 –

+0

所以你要說的是這樣的: 'Calendar c = Calendar.getInstance(「TIME_ZONE」);'對嗎?如果是這樣,用戶仍然可以在手機上操作時間。 –