如何从 Firebase 获取服务器时间

Posted

技术标签:

【中文标题】如何从 Firebase 获取服务器时间【英文标题】:How can you get the server time from Firebase 【发布时间】:2014-08-03 20:31:17 【问题描述】:

我在使用 angularjs 和 firebase 时使用

$scope.createdDate = new Date();

它使用客户端上的时间,但是我想使用 Firebase 服务器的当前时间,因为客户端时间可能会有所不同。我怎样才能以角度解决这个问题?

【问题讨论】:

是这个吗? firebase.com/docs/managing-presence.html#server-timestamps 非常感谢@JonasGrumann。 【参考方案1】:

这将返回完整日期:

firebase.firestore.Timestamp.now().toDate()

NB: import * as firebase from 'firebase';

参考:https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp

【讨论】:

它不会给你服务器时间,而是给你客户端时钟时间 我刚刚通过更改我的计算机时钟对其进行了测试。 firebase.firestore.Timestamp.now() 返回客户端时间。【参考方案2】:

2020:现在您可以使用firebase.firestore.Timestamp.now() 从服务器获取 UNIX 时间。它返回一个如下所示的对象:


    seconds: NUM_OF_SECONDS,
    nanoseconds: NUM_OF_NANOSECONDS

来自文档中的this。

【讨论】:

我很确定客户端上的now() 函数确实执行服务器请求。相反,它将返回当前的客户日期。 documentation 声明“使用当前日期创建一个新的时间戳,精度为毫秒”。 我刚刚通过更改我的计算机时钟对其进行了测试。 firebase.firestore.Timestamp.now() 返回客户端时间。【参考方案3】:

当你打印 firebase.database.ServerValue.TIMESTAMP 时,它会给你这个对象 .sv: "timestamp"

要达到 Firebase 服务器的时间戳在客户端,您首先需要将值写入到服务器,然后读取该值。

 firebase.database().ref('currentTime/').update( time: firebase.database.ServerValue.TIMESTAMP )
    .then(function (data) 
      firebase.database().ref('currentTime/')
        .once('value')
        .then(function (data) 

          var t = data.val()['time'];
          console.log('server time: ', t);

        , function serverTimeErr(err) 
          console.log('coulnd nt reach to the server time !');
        );
    , function (err) 
      console.log ('set time error:', err)
    );

我认为必须有一种更简单的方法可以直接从客户端读取服务器时间戳。

编辑 1: 刚刚找到了一种更好的方法,使用 1 次调用 firebase

firebase.database().ref('/.info/serverTimeOffset')
  .once('value')
  .then(function stv(data) 
    console.log(data.val() + Date.now());
  , function (err) 
    return err;
  );

【讨论】:

嘿,我用了你的方法,但我总是搞错日期 你怎么知道是不是错了?现在是 Firebase 服务器中的时间。 我得到了这个时间戳 = 1535916727292,它等于 50641 年 4 月 7 日。这正常吗? @FirasChebbah 自纪元以来是毫秒,而不是秒。如果需要秒数,除以 1000。 @canbax 我不是在谈论原子精度。对于游戏,一些人会更改他们设备的时钟以绕过游戏强加的时间限制。就像他们每天只能观看一次的每日广告一样,他们将时钟设置为提前 24 小时,以便每天看到多个广告。对于这些情况,您需要来自服务器的服务器时间而不检查设备的时钟。此答案中的第一个解决方案适用于此用例。【参考方案4】:

对于firebase3,请使用firebase.database.ServerValue.TIMESTAMP

$scope.createdDate = firebase.database.ServerValue.TIMESTAMP

doc here

【讨论】:

有没有办法不用先设置就可以获取服务器时间? (设置它很奇怪,然后一次获取它,然后尝试考虑延迟设置它然后获取它,最后擦除它)。 我没听明白,亲爱的。您可以随时使用 firebase.database.ServerValue.TIMESTAMP 而无需使用 .set 方法或其他方法。 当尝试从客户端访问 firebase.database.ServerValue.TIMESTAMP 的内容时,它会抛出对象 .sv: "timestamp" 。我相信它是在设置或更新时在服务器端自动替换的引用。 在this Docs Reference 中验证:ServerValue.TIMESTAMP 是 Firebase 数据库服务器自动填充当前时间戳(自 Unix 纪元以来的时间,以毫秒为单位)的占位符值。【参考方案5】:

感谢 Jonas Grumann 指出 this firebase doc 如何从 firebase 添加服务器时间。

// Get created date from Firebase servers
var createdDate = new Firebase('https://somedomain.firebaseIO.com/post/createDate');
createdDate.set(Firebase.ServerValue.TIMESTAMP);

【讨论】:

以上是关于如何从 Firebase 获取服务器时间的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 获取所有设备令牌?

Android:从firebase获取当前日期和时间

如何从 Firebase 推送通知中获取字幕

如何从 Cloud Function 获取 Firebase 项目名称或 ID

如何使用 Firebase 获取通知响应数据?

如何以毫秒为单位获取firebase服务器的当前时间戳?