我的应用程序允许用户创建他们的财务档案,例如他们的资产、支出等。这将作为文档存储在 Firestore 中,并带有当天的时间戳,如下所示:
{
Date: October 8, 2024 at 12:00:00 AM UTC-5,
annualIncome: 25000,
monthlyExpenses: 5000
}
在移动应用程序中创建日期的逻辑是
Date:Timestamp
...
this.Date = Timestamp.fromDate(new Date(now.getFullYear(), now.getMonth(), now.getDate(),0,0,0,0));
在Firebase功能中,我想在24小时后创建一个新文档,我的逻辑如下
const finColRef = db.collection("users/" + <id> + "/finance")
const fQuerySnapshot = await finColRef.orderBy("Date").limit(1).get()
fQuerySnapshot.forEach(async(doc:any) => {
let data = doc.data()
const dt = new Date()
dt.setDate(dt.getDate()+1)
data.Date = Timestamp.fromDate(new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(),0,0,0,0))
await finColRef.add(data)
});
这将创建一个新文档,并且日期现在显示:
{
Date: October 9, 2024 at 7:00:00 PM UTC-5,
annualIncome: 25000,
monthlyExpenses: 5000
}
在此日期创建的时间组件与在客户端创建的时间组件不同。这会给我带来问题,因为每个用户可能有不同的时区。我如何始终如一地处理这个问题?
Firestore 时间戳对象仅存储距 Unix 纪元的偏移量,精度为“微秒”。它没有编码任何时区,这就是你得到这个结果的原因。但请注意,不仅 Firestore,许多其他数据库在涉及时间戳对象时都不关心时区,而只关心“时间点”。 如果您想进行测试,请打开
Firebase Console 并检查时间戳字段的值,例如 Date
字段的值。您将看到时间是使用您的设备所属的本地时区显示的。请记住,客户端位于哪个时区并不重要。无论用户位于世界各地,“时间点”都是
相同。 如果您将时间戳转换为
Date
对象,则该日期对象将在用户设备的本地时区中自行转换,类似于 Firebase 控制台中发生的情况。
如果你想获取对应于特定时区的Date
对象,你应该使用一些专门的类,例如
TimeZone
。我最近还找到了所有可用时区的列表。也许会有帮助。