Firestore Timestamp.fromDate不是UTC时间

12

有人知道如何在Firestore中持久化UTC时间戳吗?

在我的Angular 应用程序中,如果我将今天的日期转换为以下时间戳,我最终会在Firestore数据库中得到一个UTC+2的日期(目前瑞士处于夏令时)。

import {firebase} from '@firebase/app';
import '@firebase/firestore';

const myTimestamp = firebase.firestore.Timestamp.fromDate(new Date());

举个例子,如果我试图将一个冬天的日期转换成UTC时间,那么在数据库中会得到一个UTC+1的时间戳。

const myTimestamp = firebase.firestore.Timestamp.fromDate(new Date(2019, 0, 1));

如果我使用 now(),将得到 UTC+2 的日期。

const now: firebase.firestore.Timestamp = firebase.firestore.Timestamp.now();

当我持久化数据时,我没有做特别的事情:

const now: firebase.firestore.Timestamp = firebase.firestore.Timestamp.now();
const myTimestamp = firebase.firestore.Timestamp.fromDate(new Date());

const myData = {
    created_at: now,
    another_value: myTimestamp
};

await this.collection.add(myData);

有什么方法可以为Firestore创建有效的UTC时间戳吗?
1个回答

23

Firestore的时间戳没有时区编码。它只是使用秒和纳秒(这些字段是Timestamp对象上的字段)的组合来存储自Unix纪元以来的偏移量。大多数日期/时间对象都是这样的 - 它们不关心时区,它们只是时间中的一个绝对点。

如果您在控制台中查看时间戳字段,则会看到显示为计算机本地设置使用的本地时区的时间。

如果您将时间戳转换为JavaScript Date对象,则该日期对象自然呈现为浏览器的本地时区,与控制台类似。

如果您想为特定的时区渲染日期对象,则应该使用库来完成,例如moment.js


正如我上面所描述的,例如当我使用fromDate时,它会计算一个偏移量到我的日期,包括时区,我有一种奇怪的感觉。当我在云管理中浏览数据库时,我确实看到了UTC+2UTC+1。此外,更奇怪的是,当我从Firestore函数(在UTC+0环境中运行)查询数据库时,除非我为时区差异添加1或2个小时进行测试,否则无法检索数据。但是,在纸面上,我同意您的观点,时间戳不应考虑时区。 - David Dal Busco
1
Firestore的时间戳与时区无关,我没有看到任何证据表明它们与时区有关。只有在屏幕上呈现时才会显示时区。 - Doug Stevenson
2
客户所在的时区并不重要。时间点无论身处何地都是相同的 - 每个人都使用相同的Unix纪元整数偏移量来表示那个时间。然而,如果您使用Date对象根据小时、分钟和秒构建时间点,全世界的人将得出不同的值,因为每个时区都有不同的中午12点。 - Doug Stevenson
7
嘿,我也遇到了这个问题。在Firestore控制台中,我看到日期是UTC +2,这也是我当前所在的时区。那么这意味着Firestore只是在我的浏览器中为我格式化UTC日期,但它确实以UTC正确存储日期吗?如果是这样,我刚刚花了3个小时来确保日期显示为UTC +0。有时我讨厌Firestore。 - sebastianf182
2
一开始我真的觉得很困惑,特别是因为它是一个数据库,你期望看到的就是你得到的。尽管Firestore的时间戳与时区无关,但Firestore控制台不应该只显示实际保存的时间戳而不转换为本地时间吗?乍一看,这似乎是数据完整性和准确性问题,直到你花了几个小时进行调试。这对于本应该是微不足道的事情来说是浪费时间。抱歉,我真的觉得这个实现非常愚蠢。最近我开始讨厌一些谷歌产品——比如Firestore和Go :( - duduwe
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接