【问题标题】:Is it possible to save a specific date to firestore without timezone?是否可以在没有时区的情况下将特定日期保存到 Firestore?
【发布时间】:2021-11-23 15:54:06
【问题描述】:

在 Firestore 中,日期存储为时间戳,因此它们与特定日期(例如 2021 年 3 月 5 日)无关,对吧? 但在我的应用程序中,重要的是我保存的数据与其保存的特定日期相关,而不是与时间戳相关。所以它与我所在的时区无关。

例如,当我在 2021 年 3 月 5 日 01:29:00 UTC+2 保存某些内容时,无论我在哪个时区,都应该是这个固定日期。因为当我在时区 UTC+0 中读取此日期时,它不再是 03/05/2021。

有没有办法告诉 firestore 特定日期是相关的?

【问题讨论】:

标签: flutter datetime dart google-cloud-firestore timestamp


【解决方案1】:

Firestore's API docs

您可以使用纳秒精度的时间戳。

阅读Timestamp class 定义:

时间戳表示独立于任何时区或日历的时间点,以 UTC 纪元时间的纳秒分辨率表示为秒和秒的分数。它是使用 Proleptic Gregorian Calendar 编码的,它将公历向后延伸到第一年。它被编码假设所有分钟都是 60 秒长,即闰秒被“涂抹”,因此不需要闰秒表进行解释。范围是从 0001-01-01T00:00:00Z 到 9999-12-31T23:59:59.999999999Z。通过限制在该范围内,我们确保可以与 RFC 3339 日期字符串相互转换。

然后add a document to your Firestore collection 使用Timestamp 类:

CollectionReference users = FirebaseFirestore.instance.collection('users');

Future<void> updateUser() {
  return users
    .doc('your_collection')
    .update({'your_time': Timestamp(<put_here_your_timestamp>)})
    .then((value) => print("User Updated"))
    .catchError((error) => print("Failed to update: $error"));
}

要了解 Firestore 的时间戳必须采用什么格式,请阅读 Google Protocol Buffer for timestamps(它是 Google 用于序列化结构化数据的语言中立、平台中立、可扩展机制。)

要了解 Firestore 的时间戳必须采用什么格式,请阅读 Google 协议缓冲区以获取时间戳(它是 Google 用于序列化结构化数据的语言中立、平台中立、可扩展机制。)

此外,当您保存像 year-month-dayT23:59:59.999999999Z 这样的时间戳时,可能会产生对时区的误解。最好使用 epoch 格式,然后在您的应用程序中将其转换为用户友好的数据格式。正如 Google 在 Protocol Buffer 上所说:

时间戳表示独立于任何时区或本地日历的时间点,以纳秒分辨率编码为秒数和秒的小数部分。该计数是相对于 1970 年 1 月 1 日 UTC 午夜的一个纪元,在公历中将公历向后延伸到第一年。

【讨论】:

    猜你喜欢
    • 2020-06-02
    • 2015-03-09
    • 1970-01-01
    • 2020-01-02
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多