2013-08-23 81 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