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 数据库 + Swift

将 Firebase Firestore 时间戳转换为日期(Swift)?

iOS Swift - 获取当前本地时间和日期时间戳

如何从swift中的时间戳获取日期格式

iOS:如何从 Firebase 检索创建于/更新的时间戳?

在 Swift 中的 Firebase 实时数据库观察方法中具有异步函数的 DispatchGroup