如何编写一个方法将快照中的所有 Firestore 时间戳转换为 JavaScript 日期?
例如,posts
集合中的快照可能会返回几个 Firestore 时间戳(createdDtTm
、modifyDtTm
):
[
{
text: 'My new post',
uid: 'nzjNp3Q',
createDtTm: Timestamp { seconds: 1596239999, nanoseconds: 999000000 },
modifyDtTm: Timestamp { seconds: 1596239999, nanoseconds: 999000000 },
},
{
text: 'Another post',
uid: 'nzjNp3Q',
createDtTm: Timestamp { seconds: 1596239999, nanoseconds: 999000000 },
modifyDtTm: Timestamp { seconds: 1596239999, nanoseconds: 999000000 },
},
]
通过映射数组并使用 toDate() 来转换各个日期非常简单。每个时间戳的方法(例如,createDtTm.toDate()
)
但是,在不显式指定时间戳字段的情况下,转换这两个(或任意任意数量)Firestore 时间戳的更通用方法是什么?
例如,Firestore 时间戳是否具有可用于识别的唯一类型?是否需要假设命名约定(例如,字段名称包含 DtTm
)?其他?
前面的问题回答了如何转换 single Timestamp或 multiple documents in a snapshot 中的单个时间戳。但是,当存在多个时间戳时,我还没有找到一种通用方法来转换快照中的所有时间戳。更具体地说,我对在 React Provider
中使用的方法感兴趣,该方法将 JavaScript 日期(而不是 Firestore 时间戳)传递给其 Consumers
,同时也不创建依赖项每次将新的时间戳字段添加到数据模型/集合时更新提供程序。
最佳答案
我认为没有任何全局方法可以做到这一点,但我认为创建一个分析快照并更改它的函数很容易。这不是很复杂。在node.js中我是这样做的:
function globalToData (snapshot) {
for (const field in snapshot)
if (snapshot[field] instanceof Firestore.Timestamp) {
snapshot[field] = snapshot[field].toDate()
}
else if (snapshot[field] instanceof Object) {
globalToData (snapshot[field]);
}
return snapshot;
};
如果您获得 DocumentSnapshot
作为示例。 snap 你可以这样调用它:
globalToData(snap.data())
这应该转换文档快照所有级别中的所有时间戳(我测试了嵌套混合映射和数组的第三级)。我们没有您的解决方案,但您可以在应用程序中间的某个位置实现此解决方案。
关于javascript - 将快照中的所有 Firestore 时间戳转换为 JS 日期的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63362436/