79

我知道您可以在 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
4

9 回答 9

130

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

admin.database.ServerValue.TIMESTAMP
于 2017-04-23T23:21:38.350 回答
103

如果您使用 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
于 2017-12-07T13:52:16.753 回答
23

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

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

如果您在 a 中使用它,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 timewhich 是自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来经过的秒数,它与时区无关。它在客户端和服务器上是相同的数字(......或几乎:-)。见unix 时间

于 2018-09-24T17:36:09.887 回答
15

我自己是 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);
    });
于 2017-04-23T05:08:06.690 回答
9

取决于用例

情况1

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

例子可以是

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

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

*返回与 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/

于 2020-10-23T05:13:05.333 回答
8

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

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)
于 2020-01-10T06:28:32.027 回答
2

它在 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(),
    })
}
于 2020-08-16T22:57:46.147 回答
0

你可以试试:

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

于 2021-05-29T17:10:24.287 回答
-1
console.log("Show current timestamp, in Milliseconds= " + Date.now());
于 2021-08-06T10:19:53.730 回答