首页 > 解决方案 > 关于在 Firebase 云函数中生成一致日期的问题

问题描述

Firebase 提供了以下两种我知道的方法,用于在将文档写入 Firestore 集合时处理日期:

以下将生成一个当前时间戳,我假设它代表所有地区的一致日期,采用其文档中注明的格式,并且是在将文档写入集合时获取当前日期的推荐方法:

admin.firestore.FieldValue.serverTimestamp()

还有以下方法将接受日期作为参数。这将生成与相同 Firestore 时间戳格式匹配的结果:

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

我一直在考虑在我的特定情况下使用后者作为生成日期的方法,我可以使用该日期将匹配日期写入 Firestore 集合中的文档以及另外单独插入到我的实时数据库中。我需要保证将完全相同的日期写入两个地方。

我在我的云功能中做什么:

const datePosted = new Date();
// then when setting the data in Firestore i do the following to convert it
admin.firestore().collection(`/posts`).doc().set({
  foo: 'bar',
  datePosted: admin.firestore.Timestamp.fromDate(datePosted)
})
// followed by a subsequent write to my Realtime database using the same date
admin.database().ref(`posts`).set({
  foo: 'bar',
  datePosted: Date.parse(datePosted)
})

任何人都可以提供有关这种方法是否是一个坏主意的任何见解吗?我需要确定以我描述的方式生成日期是否是一种有效的方法,或者它是否不可靠,因为我的文档中生成的日期可能会因我的云实例的时间和/或区域而异函数被实例化。我正在回避云功能跨不同区域实例化或出于任何其他原因可能需要的不同时间。

标签: javascriptfirebasegoogle-cloud-firestore

解决方案


admin.firestore.FieldValue.serverTimestamp()生成一个保证准确的时间戳,正如谷歌所认为的那样。实际时间将在请求到达 Firestore 时得到解决,即使请求由于某种原因(例如离线)而延迟也是如此。

admin.firestore.Timestamp.fromDate(new Date())生成一个时间戳,它使用用户设备计算的当前时间。 无法保证用户的设备具有准确的时间设置。仅当您想知道用户设备上的时钟时间时才使用此选项,即使它不准确。

由你决定。如果您希望在请求到达服务器时保证准确的时间,请使用服务器时间戳。如果您希望客户计算时间,请使用new Date().


推荐阅读