当前时间戳和数据库时间戳错误之间的Firebase时间戳差异

时间:2020-01-25 09:24:41

标签: firebase google-cloud-firestore

我写了一个public static void main(String[] args) { try { Process p = Runtime.getRuntime().exec("open /Applications/Numbers.app"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ,它确定来自特定侦听器的快照是否在设备当前时间的给定时间范围内。这种方法TimeValidityCheckUtil

checkIfTImeValid

数据库结构位于Firestore中,如下所示:

  public static boolean checkIfTimeValid(Timestamp dbTimestamp)
    {    
        Timestamp currentTimestamp = Timestamp.now();    
        Long seconds = currentTimestamp.getSeconds() - dbTimestamp.getSeconds();  
        if(seconds> 10)
        {
            return false;
        }    
        return true;    
    }

这就是发生的情况,设备A创建了一个documentId和带有时间戳的对象。

设备B监听此documentId并调用"ABC"-| | |-"documentId"-| | |-"some_key" - "string" |-"timestamp" - timestamp 来检查文档A的操作是否在当前时间戳的10s之内(以检查它是否是最近的)

即使此过程是立即发生的,设备也会显示时间戳之间的差异为〜57-62s,根据我的说法,该差异不应超过1-5s。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

Timestamp.now()是使用本地设备的时间计算的。如果设备时钟与Firebase不同步,则会在此处反映出这种差异。

我不了解Firestore的等效功能,但是在RTDB中,您可以使用特殊位置/.info/serverTimeOffset来估计时钟之间的差异(以毫秒为单位)。

firebase.database().ref('/.info/serverTimeOffset').once('value')
  .then((snap) => {
    var offset = snap.val();
    console.log('Server time delta in ms: ', offset);
    // var estimatedServerTimeMs = new Date().getTime() + offset;
  })
  .catch(console.error)

RTDB Docs