Firebase的docs about presence表示“客户端的时钟偏差”是Firebase将添加到本地报告时间(以毫秒为单位的纪元时间)来估算服务器时间的值。
然后,在示例中,它例如说:
@Override
public void onDataChange(DataSnapshot snapshot) {
double offset = snapshot.getValue(Double.class);
double estimatedServerTimeMs = System.currentTimeMillis() + offset;
}
在我用于测试的一个Android设备上,我更改了时钟,使其快4分钟(大致)。现在,当我通过Java SDK获得时钟偏差时,我得到的值如下:
232599.0
因为这是以毫秒为单位,它对应于3.87665
分钟。
但是为了估计服务器的时间,我必须将添加到本地时间戳(System.currentTimeMillis()
)。是吗?
如果客户的时钟已经快4分钟了,并且我添加那些3.9分钟,那么我的估算速度是否快8分钟?
顺便说一下,如果我可以在setPriority()
中使用服务器时间戳,那将是完美的。目前,ServerValue.Timestamp
仅适用于setValue()
,因为它不是原始值。由于我想在setPriority()
中使用时间,我必须使用System.currentTimeMillis()
和时钟偏差来计算服务器的时间。
答案 0 :(得分:1)
添加偏移量以确定相对于服务器的本地化时间。
因此,如果你得到08:05的服务器时间,你的客户端快10分钟,那么客户端机器上的时钟在客户端读取08:15(08:05 + 00:10分钟)。
如果你想在不使用ServerValue.Timestamp的情况下恢复时间,那么你会减去,这需要一个客户端时间并使其与服务器匹配(例如08:15-00:10 = 08:05)。
这是我在引入ServerValue.Timestamp之前在项目中做到这一点的方式,并且它工作得很漂亮。