swift - Swift - 处理 Firebase 时间戳
问题描述
我正在研究 firebase 项目,我在 Collection 中有 Timestamp 字段,如下图所示
当我从印度时区读取该时间戳时,我得到的日期字符串为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,我该如何实现
解决方案
Firestore 时间戳没有本地时区的感觉。您在 Firebase 控制台中看到的是在本地计算机上配置的时区中解释的时间戳。从不同的时区查看时会出现不同的显示,但时间戳表示的时间点始终保持不变。在内部,时间戳使用 UTC。从API 文档:
时间戳表示独立于任何时区或日历的时间点,以 UTC 纪元时间的纳秒分辨率表示为秒和秒的分数。它是使用 Proleptic Gregorian Calendar 编码的,它将公历向后延伸到第一年。它被编码假设所有分钟都是 60 秒长,即闰秒被“涂抹”,因此不需要闰秒表进行解释。范围是从 0001-01-01T00:00:00Z 到 9999-12-31T23:59:59.999999999Z。通过限制在该范围内,我们确保可以在 RFC 3339 日期字符串之间进行转换。
如果您想根据特定的本地时区格式化时间,您将不得不使用一些库来帮助您。时间戳对象本身无法满足您的本地时间格式化需求。
推荐阅读
- python - 用漂亮的汤刮 Asxp 页面
- airflow - 清除失败的气流 DAG 但不要重新启动
- c# - Instagram 基本显示 API:RestSharp 无效授权码响应
- linux - wxWidgets 支持什么格式的 *.wav 文件?
- python - 我的 kivy 文件在 kivy 应用程序项目中不起作用,我安装了所有东西
- python - 使用python找到具有最佳“分数”的组后,如何从列表中提取一组值?
- javascript - React Native FlatList 仅在 TextInput 或 Picker 更改时更新
- visual-studio-code - 如果导入路径不正确,VS Code (JavaScript) 会发出警告
- eclipse - Eclipse 中的自然插件不提供 ctrl+click 选项
- java - 使用任何 python 打开一个 .dir 文件