2016-11-28 9 views
0

現在のタイムスタンプに大きく依存するアプリケーションがあります。現在、ユーザーがリクエストを送信すると、System.currentTimeMillis()を使用してUTCで現在のタイムスタンプが取得されます。これは問題なく動作しますが、ユーザーがデバイス上でDate/Timeの操作を開始すると問題が発生し、タイムスタンプが不正確になります。UTCのAndroid時間同期

なぜクライアントでそれを行うのですか?なぜサーバー上でそれを処理しないのですか?さて、私のアプリケーションはオフラインで作業する必要があります。インターネットへの接続が利用できないとき、すべての私の要求はjobQueueにプッシュされます。このような場合、私は4:02pmでリクエストを提出すると、サーバーは7:30pmを受信するだけで、サーバーは4:02pmにリクエストを送信したことを知っていなければなりません。

私はどのようなオプションを検討しましたか?

  1. は、ユーザのログイン時には、私は、サーバー時間とデバイスの時刻を同期すると、ローカルにその時間を格納します。ユーザーがログインしている間にユーザーの操作が発生した場合は、Date/Time操作の目的にリッスンしてから、ユーザーがリクエストを送信するたびにオフセットとの同期時間を計算します。タイムスタンプが正確であることを確認してください。
  2. サーバの同期APIをバックエンドで実行し、アプリケーション内でサービスを設定して、サーバーの時間と同期をとり、ドリフトを探しながらユーザーの操作をリッスンします。
  3. プッシュ通知を使用して、時間同期の調整をダウンストリームでリッスンしながら、ユーザー操作をリッスンします。
  4. NTPサーバーを使用して、デバイスと時刻を同期させることもできます。

私は完全には最適ではないと思います(可能な解決策をすべて列挙したと仮定して)。私が考えていない他の解決策があるなら、私に知らせてください。

P.S. BroadcastReceiverを使用してデバイス上の日時操作をリッスンすると、そのオフセットをどのように計算することができますか?

+0

モバイルアプリのローカルタイムゾーンを使用します。 – koa73

答えて

1

私はこの質問をしてから少し時間がありましたが、何らかのリサーチや試行錯誤の後、私はNTPルートをとることにしました。あなたのためにすべてを行う素晴らしいライブラリを見つけました。

それはここで見つけることができます:

NTP TRUE TIME

クレジット人生は非常に簡単に作られていたこれらの人に。

ntpサーバーと同期する必要があります。それでは、SystemClock時間に関係なく正確なUTCを与える私たちのデルタを計算します。

0

時間同期のために、サーバーからタイムゾーンを取得するように実装できます。一度タイムゾーンを取得すると、サーバーの現在時刻を取得できます。

+0

真剣に?私はUTCを扱っているとき、タイムゾーンがここの問題だとは思わない –

+0

私は、サーバータイムゾーンを使用している場合は、タイムゾーンを使用してサーバータイムを取得することを意味しますか?ネットワークがなくても –

+0

あなたは次のようなものを使うと言っています: 'カレンダーc = Calendar.getInstance(" TIME_ZONE ");もしそうなら、ユーザは自分の電話機で時間を操作することができます。 –