问一个以前被问过并回答过的问题感觉很奇怪,但我在发帖之前确实进行了搜索。
所以我想在 Firestore 中存储时间戳,但它要么存储为 String 或 Map,但不是存储为 Timestamp 对象。
new Date()
存储为字符串Timestamp.fromDate(new Date())
或简单地 Timestamp.now()
存储为映射(秒和纳秒)我像这样导入方法:
const { Timestamp } = require("firebase/firestore");
可能值得一提,这是我通过
node filename.js
在本地测试的云功能
我做错了什么?
查看有关 Timestamp 类的文档,时间戳以秒或纳秒格式存储日期。正如您所指出的,这就是为什么您没有看到 Firebase 中存储的真正的 Date 对象。
根据我的一般经验,我通常使用在数据库中以字符串或时间戳表示形式存储的日期。获取这些日期值的服务必须将获取的数据转换为服务可以使用的数据类型。下面是一些获取和存储日期数据的示例:
// To store a timestamp using the Timestamp class:
const date = new Date();
const timestamp = firebase.firestore.Timestamp.fromDate(date); // 1676660310262
// store timestamp in database as Timestamp (results in Map)
// Once timestamp is extracted:
const fetchedTimestamp = 1676660310262
const fetchedDate = new Date(timestamp) // 'Fri, 17 Feb 2023 18:58:30 GMT'
// To store a string date, use a UTC string to maintain timezone:
const date = new Date(); // Fri Feb 17 2023 11:58:30 GMT-0700 (Mountain Standard Time)
const utcDate = date.toUTCString(); // 'Fri, 17 Feb 2023 18:58:30 GMT'
// store utcDate as a string
// Once date is extracted:
const fetchedUTCString = 'Fri, 17 Feb 2023 18:58:30 GMT';
const fetchedDate = new Date(fetchedUTCString) // Fri Feb 17 2023 11:58:30 GMT-0700 (Mountain Standard Time)
我的建议是以时间戳或字符串表示形式存储日期。然后,在读取/写入该数据的服务中,您应该在读取时将数据解析为
Date
对象,并在写入时将数据从 Date
对象解析为字符串/时间戳。
在写这篇文章之前几秒钟刚刚尝试使用
new Date()
。似乎有效。我正在使用 Modular Firebase SDK for JS v10.x.x
我首先做了一个实验(因为
serverTimestamp
是 Firestore 自己的时间戳实现):
function onAddPostButtonClick() {
setDoc(doc(db, 'posts', uuidv4()), {
url: uploadedFileURL,
tags: selectedTags.map(tag => tag.id),
createdAt: serverTimestamp()
})
}
然后这个:
function onAddPostButtonClick() {
setDoc(doc(db, 'posts', uuidv4()), {
url: uploadedFileURL,
tags: selectedTags.map(tag => tag.id),
createdAt: new Date(),
})
}
在 Firestore DB 控制台中,两者都会导致以下结果:
将鼠标悬停在它上面,我们可以看到,这是
timestamp
数据类型
我的猜测是,就像其他人指出的那样,Firestore 使用原生 JS
Date()
的更高解析格式,但 SDK 可能会填充一些零,以使其不太准确并更具兼容性。同样,如果您需要 ms / ns 级别的精度,您可能需要验证这一点。
对于所有询问为什么我们不能将其保存为字符串的人,这是因为 Firestore 查询中按时间戳进行的任何顺序都不起作用。他们将开始按文本而不是日期订购。所以2018年8月21日 > 2024年8月18日。
Firestore 不存储 JavaScript Date 对象。请参阅支持的数据类型。看来它们以亚毫秒分辨率高分辨率时间存储,就像
window.performance.now()
一样。您应该能够将 JavaScript Date
对象作为值传递,尽管使用 firebase.firestore.Timestamp.fromDate(new Date());
日期和时间:按时间顺序排列:存储在 Cloud Firestore 中时,精确 仅精确到微秒;任何额外的精度都会向下舍入。