我问的原因是因为我们知道本地写入Firestore是即时的。这意味着可以立即查询本地写入的对象。文档还告诉我们有一个ServerTimestamp注释。
ServerTimestamp
公共抽象@接口ServerTimestamp实现注解
用于标记要用服务器时间戳填充的时间戳字段的批注。如果正在编写的POJO包含@ServerTimestamp注释字段的null,它将被替换为服务器生成的时间戳。
这听起来像是这样的:如果一个对象字段被如此注释,并且该对象在本地写入,然后在本地查询,那么该字段将包含current server timestamp
。当然,这意味着本地Firestore实例在某个时刻将其时钟与服务器同步。这是真的吗?
如果为真,则可以使用这种技巧来查询当前的Firebase服务器时间,从而有效地同步时钟。
发布于 2018-09-26 04:21:02
在同步文档之前读回的写入文档的服务器时间戳的默认行为仅仅是空值。您可以使用ServerTimestampBehavior
更改此行为。将其枚举传递给getData()
以获取以下内容之一:
返回尚未设置为最终值的ServerTimestamps的本地估计值。此估计值可能与最终值不同,并且一旦服务器结果可用,可能会导致这些挂起的值发生变化。
估计值是根据客户端SDK认为是当前时间的值,使用本地时钟得出的。当写入完全提交时,时间戳可能会更改为实际的服务器值。
返回尚未设置为最终值的ServerTimestamps的前一个值。
发布于 2018-09-26 05:18:37
看起来Android Firestore文档公开了Clock Skew
时钟偏差
虽然firebase.database.ServerValue.TIMESTAMP要精确得多,并且对于大多数读/写操作是首选的,但它有时也可以用于估计客户端相对于Firebase实时数据库的服务器的时钟偏差。您可以将回调附加到位置/.info/serverTimeOffset以获取Firebase实时数据库客户端添加到本地报告时间(以毫秒为单位的纪元时间)以估计服务器时间的值(以毫秒为单位)。请注意,此偏移量的准确性可能会受到网络延迟的影响,因此主要用于发现时钟时间中的较大(> 1秒)差异。
DatabaseReference offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset");
offsetRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
double offset = snapshot.getValue(Double.class);
double estimatedServerTimeMs = System.currentTimeMillis() + offset;
}
@Override
public void onCancelled(DatabaseError error) {
System.err.println("Listener was cancelled");
}
});
这可能是同步时钟的足够方法。
https://stackoverflow.com/questions/52505804
复制相似问题