【问题标题】:How to convert Firebase Firestore timestamp to Zulu datetime format in Firebase Function如何在 Firebase 函数中将 Firebase Firestore 时间戳转换为 Zulu 日期时间格式
【发布时间】:2020-02-28 22:52:07
【问题描述】:

我在 Firestore 文档中有一个时间戳字段。 (参考 created_at)

我想将它传递给服务器一个 Datetime Zulu 时间格式,如下所示。

2019-10-31T10:29:45Z

如何将 Firestore 时间戳转换为 Zulu 时间格式字符串?

这是我在 Firebase 中的 onCreate 函数,在 Firestore 中创建文档后,我读取了时间戳字段并打印到控制台

exports.createRecord = functions.firestore
  .document(`record/{recordId}`)
  .onCreate(async (snap, context) => {

  console.log(snap.data().created_at);

});  

这将显示在 Firebase 函数日志中

Timestamp { _seconds: 1573496322, _nanoseconds: 897429000 }

如何将其转换为这种形式:

2019-11-01T01:36:56.233018Z
2019-01-01T00:00:00Z
2019-10-31T10:29:45Z

【问题讨论】:

  • 我建议为您正在使用的语言找到一个日期处理库,并使用它来格式化日期。 Firestore SDK 无法为您执行此操作。请注意,Firestore 时间戳也不编码时区。
  • 我认为应该,我想在 Firebase 函数中实现这个并在服务器上做一个 http 发布
  • 你问的格式不叫“祖鲁时间格式”。它是RFC 3339 格式,也定义为ISO 8601“完整表示扩展”格式。
  • 但是,不清楚您在问什么。您提到了onCreate 函数,但您正在展示onRequest 的示例。我可以看到in the docs onCreate 提供了一个 context,而这又提供了一个已经是 RFC3339 格式的 timestamp。那么你需要在哪里进行转换呢?如果created_at 是您自己数据中的一个字段,那么您的代码中引用的数据在哪里?请编辑您的问题以准确显示您正在尝试的代码。谢谢。
  • 我还没有实现 onCreate() 函数,所以这是要做的事情(当我们弄清楚但 oncreate 应该触发插入到 firestore 时会到达那部分)。在创建包含时间戳的文档时,我想将该信息传递给服务器端,并且服务器需要这种类型的时间格式“2019-10-31T10:29:45Z”。如果您说时间戳已经转换为 RFC3339,那么这个问题是无关紧要的。这意味着一旦我弄清楚 oncreate 并从文档中提取时间戳,我就需要尝试并更新它。

标签: firebase datetime google-cloud-firestore timestamp google-cloud-functions


【解决方案1】:

Firestore Timestamp 对象不是 Javascript Date 对象的扩展。但它包含一个toDate 方法来获取一个常规的Date 对象,您可以使用它轻松地将所需的日期格式化为字符串。

云函数在没有时区偏移(UTC 时间)的情况下运行。因此,当您格式化日期时,您可以有效地获得 Zulu 时间。使用toISOString 获取所需格式的字符串

toISOString() 方法返回简化扩展 ISO 格式 (ISO 8601) 的字符串,该字符串的长度始终为 24 或 27 个字符(YYYY-MM-DDTHH:mm:ss.sssZ 或 ±YYYYYY-MM-DDTHH:mm :ss.sssZ,分别)。时区始终为零 UTC 偏移量,由后缀“Z”表示。

尝试将上面的代码更改为此,您将看到您期望的输出。

exports.createRecord = functions.firestore
  .document(`record/{recordId}`)
  .onCreate(async (snap, context) => {

  console.log(snap.data().created_at.toDate().toISOString());

});  

其他资源

Moment JS 是一个很棒且易于使用的库,如果您需要更复杂地操作日期或使用时区。它增加了函数依赖的一些开销,但确实有助于代码的可读性。

【讨论】:

  • toDate() 似乎有效,但不适用于 .toISOString()。这是错误:gist.github.com/axilaris/91a00fb42b616fa5283653e60fac2a54。我有兴趣看看 toISOString(),知道如何让它工作吗?
  • 如上面的答案所述:Firestore 时间戳不是 JavaScript 日期。您必须先致电toDate。请参阅上面我的答案中的类参考
猜你喜欢
  • 2018-12-09
  • 2021-11-04
  • 2020-03-21
  • 1970-01-01
  • 2020-02-23
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
相关资源
最近更新 更多