Swift - 处理 Firebase 时间戳
Posted
技术标签:
【中文标题】Swift - 处理 Firebase 时间戳【英文标题】:Swift - Handling Firebase Timestamp 【发布时间】:2020-05-11 23:00:58 【问题描述】:我正在开发 firebase 项目,我在 Collection 中有 Timestamp 字段,如下图所示
Firebase screenshot
当我从 印度时区 读取该时间戳时,我得到的日期字符串为 Sun Jan 26, 2020 12:00 AM
但是当我从 Pago Pago - American Samoa(GMT-11) time Zone 阅读它时,我得到的日期字符串为 Sat Jan 25, 2020 07:30 AM
我正在使用下面的代码
let formatter = DateFormatter()
formatter.dateFormat = "EEE MMM dd, yyyy hh:mm a"
let coll = Firestore.firestore().collection("Collection1")
coll.getDocuments (snap, error) in
for doc in snap!.documents
let date = doc["createdOn"] as! Timestamp
print(formatter.string(from: date.dateValue()))
在 Firebase 中,我将该日期字段值配置为 Sun Jan 26, 2020 12:00 AM UTC +5:30。
我的问题是不分时区,我希望日期字符串结果为 Sun Jan 26, 2020,我该如何实现呢
【问题讨论】:
【参考方案1】:Firestore 时间戳没有本地时区的含义。您在 Firebase 控制台中看到的是在本地计算机上配置的时区中解释的时间戳。从不同的时区查看时会出现不同的显示,但时间戳表示的时间点始终保持不变。在内部,时间戳使用 UTC。来自API documentation:
时间戳表示独立于任何时区的时间点或 日历,表示为秒和秒的分数 UTC 纪元时间的纳秒分辨率。它是使用编码的 Proleptic Gregorian Calendar 扩展了公历 倒退到第一年。它被编码假设所有分钟都是 60 秒长,即闰秒被“涂抹”,因此没有闰秒 解释需要表格。范围是从 0001-01-01T00:00:00Z 至 9999-12-31T23:59:59.999999999Z。通过限制在该范围内,我们 确保我们可以与 RFC 3339 日期字符串相互转换。
如果您想根据特定的本地时区格式化时间,您将不得不使用一些库来帮助您。时间戳对象本身无法满足您的本地时间格式化需求。
【讨论】:
我了解从不同时区查看时,firebase 控制台时间戳会显示不同。我的场景是我正在配置将在 1 月 26 日发生的事件,如果我使用 Swift 从 firebase 读取并在 iPhone UI 上显示它,我会在印度时区看到 1 月 26 日,但我在帕果帕果的朋友 - 美属萨摩亚 (GMT- 11) 时区在他的 iPhone 中显示为 1 月 25 日,如何使用 DateFormatter 正确显示日期 您可能需要考虑完全不使用时间戳,而是使用不同的表示没有时间的一天,例如 YYYYMMDD。以上是关于Swift - 处理 Firebase 时间戳的主要内容,如果未能解决你的问题,请参考以下文章
将 Firebase Firestore 时间戳转换为日期(Swift)?