Android 使用脱机连接检索服务器时间戳的结果是什么

Android 使用脱机连接检索服务器时间戳的结果是什么,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在Firebase中通过脱机连接检索服务器时间戳的结果是什么? 无效的(我猜) 因此,脱机应用程序总是需要在/.info/serverTimeOffset处使用特殊位置?JavaScript中的快速测试: var ref = firebase.database().ref("/.info/serverTimeOffset"); document.querySelector("#getOffset").addEventListener("click", function(e) { e.pre

在Firebase中通过脱机连接检索服务器时间戳的结果是什么? 无效的(我猜)


因此,脱机应用程序总是需要在/.info/serverTimeOffset处使用特殊位置?

JavaScript中的快速测试:

var ref = firebase.database().ref("/.info/serverTimeOffset");

document.querySelector("#getOffset").addEventListener("click", function(e) {
  e.preventDefault();
  ref.once('value',function(snapshot) {
    var li = document.createElement("li");
    li.innerText = new Date().toString()+": "+snapshot.val();
    document.querySelector("#offsets").appendChild(li);
  });
  return false;
})
输出:

上网:

2017年8月6日星期日17:59:29 GMT-0700(PDT):-3270

脱机:

2017年8月6日星期日17:59:39 GMT-0700(PDT):-3270 2017年8月6日星期日17:59:43 GMT-0700(PDT):-3270

重新联机:

2017年8月6日星期日17:59:55 GMT-0700(PDT):-3269

因此,它似乎返回最后一次连接时的缓存值


有关实际工作版本,请参见。

我编写了以下代码:

final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("foo");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.d("TAG", "system time " + System.currentTimeMillis());
        Log.d("TAG", "snap " + dataSnapshot);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});
ref.setValue(ServerValue.TIMESTAMP);
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        ref.setValue(ServerValue.TIMESTAMP);
    }
}, 2000);
脱机运行时,它将设置一个时间戳,然后在两秒钟后设置另一个时间戳。监听器每次都会启动,时间戳的值将匹配(或几乎完全匹配)system.currentTimeMillis()中的系统时间

然后,当设备联机时,该值将同步,并且与本地时间的差异会更大(因为实际的服务器时间终于开始了)

下面是日志的样子。您可以看到第三对日志在联机同步后具有更明显的时间戳差异:

D/TAG: system time 1502071462035
D/TAG: snap DataSnapshot { key = foo, value = 1502071462001 }
D/TAG: system time 1502071463993
D/TAG: snap DataSnapshot { key = foo, value = 1502071463993 }
D/TAG: system time 1502071511215
D/TAG: snap DataSnapshot { key = foo, value = 1502071511650 }

底线是,如果您在脱机时读取写入的服务器时间戳,则应该获得客户端时间戳。

您是否特别询问,如果您在脱机时在某个位置写入服务器时间戳,然后在脱机时再次尝试读取,会发生什么情况?因为一旦该值被同步,它将始终只是一个数字,没有任何记录表明它是一个特殊的服务器时间戳。但看起来排序在脱机连接中不起作用。当我切换到连接状态时,它可以很好地订购物品。因此,在没有连接的情况下检索时间戳就像什么都没有发生,没有结果一样道格·史蒂文森谢谢你的回答,这对弗兰克·范·帕夫伦非常有帮助。服务器时间戳不会保存在存储器中,而是使用我的应用程序所需的特殊位置。@FrankVanPuffelen,要在Firestore中获取时间戳的近似值,我是否应该收听
Firestore.collection(“/.info/serverTimeOffset”)