私は完璧な解決策を見つけられませんでしたが、毎回フィールドに書き込む必要がないようにする方法があります。 Firebaseには組み込みのフィールド/.info/serverTimeOffset
があり、Firebaseはクライアントとサーバの時間差を考慮したものを含んでいます。
私はこのようなクラスを使用して、サーバーから受信したタイムスタンプをローカルのタイムスタンプに変換して(まともに)同期したカウントダウンを実現しています。
public class ServerTimeSyncer {
private static final String TAG = "ServerTimeSyncer";
private DatabaseReference mServerTimeOffsetReference;
private long mServerTimeOffset;
public long convertServerTimestampToLocal(final long serverTimestamp) {
return serverTimestamp - mServerTimeOffset;
}
public void startServerTimeSync() {
if (mServerTimeOffsetReference == null) {
mServerTimeOffsetReference = FirebaseDatabase.getInstance().getReference("/.info/serverTimeOffset");
mServerTimeOffsetReference.addValueEventListener(mServerTimeOffsetListener);
}
}
public void stopServerTimeSync() {
if (mServerTimeOffsetReference != null) {
mServerTimeOffsetReference.removeEventListener(mServerTimeOffsetListener);
mServerTimeOffsetReference = null;
}
}
private final ValueEventListener mServerTimeOffsetListener = new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot snapshot) {
mServerTimeOffset = snapshot.getValue(Long.class);
Log.i(TAG, "Server time offset set to: " + mServerTimeOffset);
}
@Override
public void onCancelled(DatabaseError error) {
Log.w(TAG, "Server time sync cancelled");
}
};
}
は、詳細はhttps://firebase.google.com/docs/database/android/offline-capabilities#clock-skewを参照してください。
その他の注: これは接続の開始時にのみ起動されるため、デバイスの時刻を変更した後に正しいオフセットを取得するためには、アプリを再起動する必要があります。