如何在 Cloud Functions for Firebase 中获取服务器时间戳?

How do I get the server timestamp in Cloud Functions for Firebase?

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

在网络上是 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

我自己是 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);
    });

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

admin.database.ServerValue.TIMESTAMP

如果您使用 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

为未来的读者澄清:

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

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

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

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

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

firebase.database.ServerValue and in this 中查看更多信息。

Date.now() 如果您想将它用于计算或任何其他一般用途,则在 database 函数之外工作得很好。

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

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

在客户端使用相当于 Timestamp.now() 的云函数中的以下内容,此 returns 当前时间戳

admin.firestore.Timestamp.now()

但是如果你想从 Date 对象初始化 Timestamp,你可以按如下方式进行

admin.firestore.Timestamp.fromDate(new 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)

它在 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(),
    })
}

取决于用例

案例 1

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

例子可以是

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

注意 serverTimestamp return 是一个 non-null 对象,是 auto-populating 当前时间戳的占位符值。 它不包含实际时间戳。数据库将在执行命令时替换此占位符

*Returns 与 set()、create() 或 update() 一起使用的标记,用于在写入数据中包含 server-generated 时间戳。

@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/

你可以试试:

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

console.log("Show current timestamp, in Milliseconds= " + Date.now());