0

プレゼンスに関するFirebase のドキュメントによると、「クライアントのクロック スキュー」は「Firebase がサーバー時間を推定するために、ローカルで報告された時間 (ミリ秒単位のエポック時間) に追加する」値です。

次に、例では、たとえば次のように述べています。

 @Override
 public void onDataChange(DataSnapshot snapshot) {
     double offset = snapshot.getValue(Double.class);
     double estimatedServerTimeMs = System.currentTimeMillis() + offset;
 }

テストに使用する 1 台の Android デバイスで、時計を変更して 4 分 (およそ) 速くしました。Java SDK を介してクロック スキューを取得すると、次のような値が得られます。

232599.0

これはミリ秒単位なので、3.87665分に相当します。

しかし、サーバーの時刻を推定するには、それをローカルのタイムスタンプ ( ) に追加System.currentTimeMillis()する必要があります。そうですか?

クライアントのクロックがすでに 4 分進んでいる場合、その 3.9 分を追加すると、約 8 分速い見積もりが得られませんか?

ちなみに、サーバーのタイムスタンプが使えれば完璧ですsetPriority()。現在、プリミティブな値ではないServerValue.Timestampため、 でのみ使用できます。setValue()で時刻を使用したいので、 とクロックのずれsetPriority()を使用してサーバーの時刻を計算する必要があります。System.currentTimeMillis()

4

1 に答える 1

1

オフセットを追加して、サーバーに相対的なローカライズされた時間を決定します。

したがって、08:05 のサーバー時刻を取得した場合、クライアントは 10 分進んでおり、クライアントのマシンの時計はクライアントで 08:15 (08:05 + 00:10 分) を読み取ります。

ServerValue.Timestamp を使用せずに時刻を元に戻したい場合は、減算します。これにはクライアントの時間がかかり、サーバーと一致するようになります (例: 08:15 - 00:10 = 08:05)。

これは、 ServerValue.Timestamp が導入される前にプロジェクトで行った方法であり、うまく機能しました。

于 2013-08-23T16:14:44.710 に答える