Firebase firestore 处理时间戳问题

问题描述 投票:0回答:1

我的应用程序允许用户创建他们的财务档案,例如他们的资产、支出等。这将作为文档存储在 Firestore 中,并带有当天的时间戳,如下所示:

{
Date: October 8, 2024 at 12:00:00AM 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:00PM UTC-5,
annualIncome: 25000,
monthlyExpenses: 5000
}

在此日期创建的时间组件与在客户端创建的时间组件不同。这会给我带来问题,因为每个用户可能有不同的时区。我如何始终如一地处理这个问题?

javascript firebase google-cloud-platform google-cloud-firestore google-cloud-functions
1个回答
0
投票

Firestore 时间戳对象仅存储距 Unix 纪元的偏移量,精度为“微秒”。它没有编码任何时区,这就是你得到这个结果的原因。但请注意,不仅 Firestore,许多其他数据库在涉及时间戳对象时都不关心时区,而只关心“时间点”。 如果您想进行测试,请打开

Firebase Console

并检查时间戳字段的值,例如 Date 字段的值。您将看到时间是使用您的设备所属的本地时区显示的。请记住,客户端位于哪个时区并不重要。无论用户位于世界各地,“时间点”都是

相同
如果您将时间戳转换为

Date

对象,则该日期对象将在用户设备的本地时区中自行转换,类似于 Firebase 控制台中发生的情况。

如果你想获取对应于特定时区的

Date

对象,你应该使用一些专门的类,例如

TimeZone
。我最近还找到了所有可用
时区
的列表。也许会有帮助。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.