【问题标题】:Swift - Handling Firebase TimestampSwift - 处理 Firebase 时间戳
【发布时间】: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,我该如何实现呢

【问题讨论】:

    标签: swift firebase google-cloud-firestore timestamp nsdateformatter


    【解决方案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。
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2016-07-11
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多