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

时间:2017-04-23 04:15:20

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

我知道你可以在web,ios和android中提取服务器时间戳 - 但是新的Cloud Functions for Firebase呢?我无法弄清楚如何获得服务器时间戳?用例是我希望在邮件到达时为其添加时间戳。

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

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

我认为现在已经很晚了,我可能会忽略这一点......

修改

我正在这样初始化

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

然后,就像这样被召唤..

Firebase.database.ServerValue.TIMESTAMP

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

admin.database().ServerValue.TIMESTAMP

fb.ServerValue.TIMESTAMP

9 个答案:

答案 0 :(得分:74)

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

admin.database.ServerValue.TIMESTAMP

答案 1 :(得分:39)

如果您使用Firebase Admin SDK,则此处的语法正确(Checked 2017-12-07):

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

答案 2 :(得分:10)

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

答案 3 :(得分:6)

只是为将来的读者澄清一下:

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.ServerValue和此SO question中了解有关此内容的更多信息。

Date.now()database函数以外的其他环境下工作正常,如果您想将其用于计算或任何其他常规用途。

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

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

答案 4 :(得分:5)

在云功能中使用等效于客户端Timestamp.now()的以下内容,这将返回当前的时间戳记

admin.firestore.Timestamp.now()

但是,如果要从Date对象初始化Timestamp,则可以按以下步骤进行操作

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

如果要初始化时间戳记以用于将来或过去的日期,则首先从解析字符串或设置要设置的时间中初始化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)

答案 5 :(得分:1)

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

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

sum = or(sequence(term, op('+', 1), sum), term)

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

// 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()
});

答案 6 :(得分:1)

取决于用例

情况1

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

示例可以

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

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

时替换该占位符

*返回与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 :(得分:0)

你可以试试:

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

答案 8 :(得分:0)

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