【问题标题】:How do I get the server timestamp in Cloud Functions for Firebase?如何在 Cloud Functions for Firebase 中获取服务器时间戳?
【发布时间】:2017-09-19 21:48:19
【问题描述】:

我知道您可以在 web、ios 和 android 中提取服务器时间戳 - 但 Firebase 的新 Cloud Functions 呢?我不知道如何在那里获取服务器时间戳?用例是我想在电子邮件到达时为其添加时间戳。

在网络上是 Firebase.database.ServerValue.TIMESTAMP

但功能节点服务器界面中似乎没有?

我认为已经晚了,我可能会错过这里的重点......

编辑

我是这样初始化的

admin.initializeApp(functions.config().firebase);
const fb = admin.database()

然后,它被这样调用..

Firebase.database.ServerValue.TIMESTAMP

但是,这是来自客户端集成。在 Functions 上,Firebase 不会像这样初始化。我试过了

admin.database().ServerValue.TIMESTAMP

fb.ServerValue.TIMESTAMP

【问题讨论】:

  • 据我所知,ServerValue.TIMESTAMP 在 Cloud Functions for Firebase 中同样可用。可以分享minimal code that reproduces the problem吗?
  • 嗨@FrankvanPuffelen - 我用我的初始化示例编辑了原件,什么不起作用。

标签: node.js firebase firebase-realtime-database google-cloud-functions firebase-admin


【解决方案1】:

由于您已经在使用管理 SDK,因此正确的语法是:

admin.database.ServerValue.TIMESTAMP

【讨论】:

  • 这是我一直在寻找的简单答案 - 谢谢@frank-van-pufen
  • 你如何用这个以毫秒为单位打印时间戳? admin.database.ServerValue.TIMESTAMP 返回一个对象 { '.sv': 'timestamp' },我认为它是一个占位符
  • 确实是一个占位符。要获取实际值,请监听您写入的位置。
  • 这和普通的 JS 日期中的值有什么不同吗?
【解决方案2】:

如果您使用 Firebase Admin SDK,以下是正确的语法(检查于 2019-08-27):

const admin = require('firebase-admin');
// or
// import * as admin from 'firebase-admin';

// Using Cloud Firestore
admin.firestore.FieldValue.serverTimestamp()

// Using Realtime Database
admin.database.ServerValue.TIMESTAMP

【讨论】:

  • 像魅力一样工作 :-) 谢谢。
  • 我认为对于云 Firestore 必须是:admin.firestore.FieldValue.serverTimestamp()
  • firestore.FieldValue.serverTimestamp() 不适用于 nodejs firebase 函数。
  • 2021:admin.firestore.Timestamp.now()
【解决方案3】:

只是为了向未来的读者澄清:

admin.database.ServerValue.TIMESTAMP 返回一个non-null Object,是一个用于自动填充当前时间戳的占位符值。它不包含实际的时间戳。数据库将在执行命令时替换此占位符。

如果您在 database.ref 中使用它,那么它会按照您的预期工作,并且是输入时间戳的首选方式:

var sessionsRef = firebase.database().ref("sessions");
sessionsRef.push({
startedAt: firebase.database.ServerValue.TIMESTAMP // this will write 'startedAt: 1537806936331`
});

但是如果你尝试在数据库函数之外使用它(例如返回现在的时间或进行一些计算)它会返回一个你不能使用它的对象:

console.log(firebase.database.ServerValue.TIMESTAMP) // this will return an [object Object]

firebase.database.ServerValueSO question 中查看更多信息。

如果您想将Date.now() 用于计算或任何其他一般用途,Date.now() 可以在 database 函数之外正常工作。

console.log(Date.now()); // this will return 1537806936331

它们都使用unix time,这是自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来经过的秒数,它与时区无关。它在客户端和服务器上是相同的数字(......或几乎:-)。见unix time

【讨论】:

  • 新手的最佳答案! :)
  • 你好,当我写时间戳并将其保存到数据库中时,我在云函数消息中得到了这个消息:'消息传递负载包含“notification.timestamp”属性的无效值。值必须是字符串。 @SpiralOut
  • @DevAS 尝试发布一个新问题,其中包含有关您的代码的更多详细信息。但 Notification.timestamp 不是 firebase db 关键字。也许使用 firebase.database.ServerValue.TIMESTAMP
【解决方案4】:

我自己是 node.js 的新手,但 Date.now() 在我的测试中有效。

编辑

我误解了您的问题 - 没有意识到您想要为存储在 Firebase 数据库中的数据添加时间戳。我以为您只是想在运行云功能的服务器上获取时间。如果您想为存储在 Firebase 数据库中的已接收电子邮件添加时间戳,那么使用 admin.database.ServerValue.TIMESTAMP 无疑是最佳方法。

只是为了我自己的教育,我写了下面的函数来看看时间比较。我希望云功能服务器和数据库服务器上的时间同步到一个非常准确的时间参考。当我运行这个函数时,数据库时间戳通常在Date.now() 值的一百毫秒内。数据库时间戳稍晚一点是合理的,因为云函数需要一些时间来连接数据库并执行写入。

exports.timeTest = functions.database.ref('/test/trigger')
    .onWrite(event => {

        const now= Date.now();
        console.log('now=', now);

        const timeVals = {
          dateNow : now,
          serverTimestamp : admin.database.ServerValue.TIMESTAMP
        };

        return event.data.ref.parent.child('times').update(timeVals);
    });

【讨论】:

  • Date.now() 是获取节点服务器时间,还是从客户端计算机获取时间来进行计算?还是它使用一些标准化的时钟?如果我将计算机时间设置为一个时间,Date.now() 是否将其设置为不同的时间,Date.now() 是否会得到两个不同的结果?
  • @JustinHandley:更新了我的答案。 Date.now() 是服务器上运行云功能的时间。它完全独立于任何客户端计算机上的时间。
  • admin.database.ServerValue.TIMESTAMP 是您使用 Firebase 规则测试 this == now (Bolt) 时唯一可接受的解决方案
【解决方案5】:

在云函数中使用以下等效于客户端的Timestamp.now(),返回当前时间戳

admin.firestore.Timestamp.now()

但如果你想从 Date 对象初始化 Timestamp,你可以这样做

admin.firestore.Timestamp.fromDate(new Date())

如果您想为将来或过去的日期初始化 Timestamp,那么首先通过解析字符串或设置您要设置的时间初始化 Date 对象并将其传递给 Timestamp.fromDate()

var date = new Date('Wednesday, October 30, 2019 09:10 PM')
//or date = new Date('2014-06-30T06:40:53+05:30')
var timestamp = admin.firestore.Timestamp.fromDate(date)

【讨论】:

    【解决方案6】:

    取决于用例

    案例 1

    您想将文档字段设置为服务器时间戳

    例子可以是

    user {
      email: "example.com",
      lastUpdated: admin.firestore.FieldValue.serverTimestamp(),
    }
    

    注意serverTimestamp 返回一个非空对象并且是一个用于自动填充当前时间戳的占位符值。 它不包含实际的时间戳。数据库将在执行命令时替换此占位符

    *返回与 set()、create() 或 update() 一起使用的标记,以在写入的数据中包含服务器生成的时间戳。

    @return 用于调用 set()、create() 或 update() 的 FieldValue 标记。*

    案例2

    你想为你的函数逻辑使用服务器时间戳

    if (currentTime == 6pm) // TODO: send push notifications
    else // TODO: do nothing
    

    为此,您可能想要做类似的事情

    admin.firestore.Timestamp.now()admin.firestore.Timestamp.fromDate(new Date())

    好读:https://bigcodenerd.org/firebase-server-timestamp-cloud-functions/

    【讨论】:

      【解决方案7】:

      它在 2020 年 8 月 16 日的文档中。

      https://cloud.google.com/firestore/docs/manage-data/add-data#server_timestamp

      // Get the `FieldValue` object
      const FieldValue = admin.firestore.FieldValue;
      
      // Create a document reference
      const docRef = db.collection('objects').doc('some-id');
      
      // Update the timestamp field with the value from the server
      const res = await docRef.update({
        timestamp: FieldValue.serverTimestamp()
      });
      

      这是我在代码中使用它的方式:

      const createUserDoc = (user) => {
          const FieldValue = admin.firestore.FieldValue
          return db.collection('users').doc(user.uid).set({
              memberSince: FieldValue.serverTimestamp(),
          })
      }
      

      【讨论】:

        【解决方案8】:

        你可以试试:

        const 时间戳 = admin.firestore.Timestamp.now();

        【讨论】:

          【解决方案9】:
          console.log("Show current timestamp, in Milliseconds= " + Date.now());
          

          【讨论】:

            猜你喜欢
            • 2018-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-24
            • 1970-01-01
            • 2020-10-22
            相关资源
            最近更新 更多