首页 > 解决方案 > Swift - 处理 Firebase 时间戳

问题描述

我正在研究 firebase 项目,我在 Collection 中有 Timestamp 字段,如下图所示

Firebase 屏幕截图

当我从印度时区读取该时间戳时,我得到的日期字符串为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,我该如何实现

标签: swiftfirebasegoogle-cloud-firestoretimestampnsdateformatter

解决方案


Firestore 时间戳没有本地时区的感觉。您在 Firebase 控制台中看到的是在本地计算机上配置的时区中解释的时间戳。从不同的时区查看时会出现不同的显示,但时间戳表示的时间点始终保持不变。在内部,时间戳使用 UTC。从API 文档

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

如果您想根据特定的本地时区格式化时间,您将不得不使用一些库来帮助您。时间戳对象本身无法满足您的本地时间格式化需求。


推荐阅读