2013-08-23 80 views
0

火力地堡的docs about presence说,“客户端的时钟偏斜”是一个值“火力地堡将添加到本地报告的时间(以毫秒为单位划时代的时间)来估计服务器时间”。登陆火力地堡的时钟歪斜

然后,在实施例中,它说例如:

@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()和时钟偏差来计算服务器的时间。

回答

1

您添加偏移量以确定相对于服务器的本地化时间。因此,如果服务器时间为08:05,则客户端快10分钟,则客户端计算机上的时钟在客户端读取08:15(08:05 + 00:10分钟)。

如果您想要在不使用ServerValue.Timestamp的情况下恢复时间,则需要减去客户端时间并使其与服务器匹配(例如08:15 - 00:10 = 08:05)。

这是我做到了在项目中引入之前ServerValue.Timestamp和它的工作漂亮。

+0

是的,谢谢:)这是我在做什么为好,但你不看看它是如何错误的'onDataChange()'我已经从文档中引用?他们本质上是'estimatedServerTimeMs = System.currentTimeMillis()+ offset'这是错误的,不是吗? – caw

+0

顺便说一句,当使用'ServerValue.Timestamp'时,你不能自己指定密钥,我得到这个权利吗?它的类型是java.util.Map ',因此在Java中不可能如下所示:https://www.firebase.com/docs/javascript/servervalue /TIMESTAMP.html – caw

+0

Marco,如果服务器时间(现在)是早上8:04,并且您在客户端解析了4分钟快速的客户端,那么您将在8分钟前(四分钟前)获得服务器时间。您必须添加4才能使其8:08(现在)。我已经与Firebase开发者讨论了setPriority()错误,他们将为此进行修复。 – Kato