Firestore Timestamp.fromDate 不是 UTC

IT技术 javascript angular datetime google-cloud-firestore
2021-03-10 21:46:26

任何人都知道如何在 Firestore 中保留 UTC 时间戳?

在我的Angular应用程序中,如果我将今天的日期转换为如下所示的时间戳,并且我最终会UTC+2在 Firestore 数据库中得到一个(现在是瑞士的夏令时)日期

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

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

例如,如果我尝试从冬季时间转换日期,我最终会UTC+1在数据库中使用Timestamp

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);

知道如何UTC为 Firestore创建有效的时间戳吗?

1个回答

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

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

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

如果您想为特定时区呈现 Date 对象,您应该使用一个库来为您执行此操作,例如moment.js

谢谢你的回答。您对没有有关时区信息的时间戳是正确的。还尝试在本地来回转换日期,看起来是正确的。我想在 Cloud 控制台中显示 UTC 信息也是一个提示 关于我的 Cloud 功能,我做了一些更改,我终于能够获取我的数据。不确定它是否适用于不同时区的客户,但至少它似乎比以前更好,因此我再次将您的答案标记为正确的答案,谢谢!
2021-04-26 21:46:26
Firestore 时间戳与时区没有任何关系。我没有看到任何证据表明他们这样做了。只有当它们在屏幕上呈现时,您才会看到时区。
2021-05-02 21:46:26
客户端所在的时区无关紧要。无论您身在何处,时间点都是相同的 - 每个人都使用相同的 unix epoch 整数偏移量来表示该时间。但是,如果使用 Date 对象根据小时、分钟和秒构建时间点,世界各地的人们会得出不同的值,因为每个 TZ 都有不同的 12pm。
2021-05-05 21:46:26
如上所述,fromDate例如,当我使用时,它会计算我的日期的偏移量,包括我有种感觉的时区,奇怪的是。当我在 Cloud admin 中浏览数据库时,我确实看到了UTC+2UTC+1此外,奇怪的是,当我从 Firestore 函数(在UTC+0环境中运行查询数据库时,我无法检索数据,除非我出于测试目的添加 1 或 2 小时的时区差异但是是的在纸上我同意你的看法,时间戳不应该考虑时区
2021-05-09 21:46:26
嘿嘿,我也有这个问题。我在 Firestore 控制台中看到日期是 UTC +2,这是我当前所在的 TZ。这意味着 Firestore 只是在我的浏览器中为我格式化了 UTC 日期,但它正确地以 UTC 格式存储了它?如果是这样,我只是浪费了 3 个小时来确保该日期显示为 UTC +0。有时我讨厌firestore。
2021-05-09 21:46:26