在Firebase中使用脱机连接检索Server TimeStamp的结果是什么? 空值? (我猜)
所以离线应用程序总是需要使用/.info/serverTimeOffset上的特殊位置吗?
答案 0 :(得分:0)
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;
})
输出:
上网:
Sun Aug 06 2017 17:59:29 GMT-0700(PDT): - 3270
离线:
Sun Aug 06 2017 17:59:39 GMT-0700(PDT): - 3270 Sun Aug 06 2017 17:59:43 GMT-0700(PDT): - 3270
回到网上:
Sun Aug 06 2017 17:59:55 GMT-0700(PDT): - 3269
所以它似乎从它连接的最后一刻返回缓存的值。
有关实际工作版本,请参阅this jsbin。
答案 1 :(得分:0)
我写了这段代码:
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 }
最重要的是,如果您读取脱机时写入的服务器时间戳,则应该获取客户端时间戳。