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

Jus*_*ley 38 node.js firebase firebase-realtime-database google-cloud-functions firebase-admin

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

在Web上,它是Firebase.database.ServerValue.TIMESTAMP

但这似乎在功能节点服务器接口中不可用?

我觉得已经很晚了,我可能会忽略这一点......

编辑

我正在这样初始化

admin.initializeApp(functions.config().firebase);
const fb = admin.database()
Run Code Online (Sandbox Code Playgroud)

然后,就像这样被调用..

Firebase.database.ServerValue.TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

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

admin.database().ServerValue.TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

fb.ServerValue.TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 83

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

admin.database.ServerValue.TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

  • 你怎么用这个打印时间戳(以毫秒为单位)?admin.database.ServerValue.TIMESTAMP返回一个对象{'.sv':'timestamp'},我相信它是一个占位符 (6认同)
  • 它确实是一个占位符。要获取实际值,请侦听您写入的位置。 (3认同)

Pau*_*aul 52

如果您使用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
Run Code Online (Sandbox Code Playgroud)

  • 2021: `admin.firestore.Timestamp.now()` (14认同)
  • 2023:`从'firebase-admin/firestore'导入{时间戳};时间戳.now()` (4认同)
  • 我认为对于云Firestore必须是:admin.firestore.FieldValue.serverTimestamp() (3认同)

Bob*_*der 11

我自己是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);
    });
Run Code Online (Sandbox Code Playgroud)

  • 当您使用Firebase规则来测试`this == now`(Bolt)时,admin.database.ServerValue.TIMESTAMP是唯一可接受的解决方案 (2认同)

Spi*_*Out 10

为了向以后的读者说明:

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

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

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

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

console.log(firebase.database.ServerValue.TIMESTAMP) // this will return an [object Object]
Run Code Online (Sandbox Code Playgroud)

firebase.database.ServerValue和此SO问题中了解更多有关它的信息。

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

console.log(Date.now()); // this will return 1537806936331
Run Code Online (Sandbox Code Playgroud)

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


ked*_*ked 7

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

admin.firestore.Timestamp.now()
Run Code Online (Sandbox Code Playgroud)

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

admin.firestore.Timestamp.fromDate(new Date())
Run Code Online (Sandbox Code Playgroud)

如果你想为未来或过去的日期初始化时间戳,那么首先从解析字符串或设置你想要设置的时间初始化日期对象并将其传递给 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)
Run Code Online (Sandbox Code Playgroud)


sul*_*rza 5

取决于用例

情况1

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

例子可以是

user {
  email: "example.com",
  lastUpdated: admin.firestore.FieldValue.serverTimestamp(),
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

案例2

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

if (currentTime == 6pm) // TODO: send push notifications
else // TODO: do nothing
Run Code Online (Sandbox Code Playgroud)

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

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

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