【问题标题】: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 午夜的一个纪元,在公历中将公历向后延伸到第一年。