swift - 如何从 Firestore 服务器时间戳中提取本地时间?
问题描述
- 我基本上使用FieldValue.serverTimestamp()将时间戳存储在firestore中
- 我也知道 serverTimestamp 是基于UTC的,所以当我检索它时,我需要转换为本地时间戳
- 我需要本地时间作为字符串
问题是我成功地将服务器日期转换为本地日期,但无法将时间提取为字符串。这是代码:
let serverTimestamp = getFirestoreTimestampFromServer()
let utcTimestamp: Int64 = Int64(serverTimestamp.dateValue().timeintervalSince1970)
let localTimezoneOffsetFromUtc = Int64(TimeZone.current.secondsFromGMT())
let localTimestamp = utcTimestamp + localTimezoneOffsetFromUtc
let localDate = Date(timeIntervalSince1970: TimeInterval(integerLiteral: localTimestamp))
print(localDate)
//This works, I get the local date as 2020-07-20 20:10:40 +0000
//So server timestamp is successfully converted
//BUT----
let dateFormatter1 = DateFormatter()
dateFormatter1.dateFormat = "hh:mm"
let localTimeString = dateFormatter1.string(from: localDate)
print(localTimeString)
当我打印本地时间字符串时,我得到"1:40"而不是"20:10"。供您参考,我的当地时间比格林威治标准时间或我的服务器时间早 5 小时。
同样,时间戳已成功转换,但未将提取时间转换为字符串部分。
解决方案
原来我不必使用 secondsFromGMT。使用 Timestamp.dateValue().timeintervalSince1970 并简单地使用 dateformatter 来获取所需的时间
let serverGMTTime = getServerTime() as? Timestamp
let convertedTime = Int(serverTime.dateValue().timeintervalSince1970)
let localDate = Date(timeintervalSince1970: TimeInterval(integerLiteral: convertedTime)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm"
let stringLocalTime = dateFormatter.string(from: localDate)
推荐阅读
- rstudio - Rstudio 启动错误:rstudio_boost:::filesystem::read_symlink
- php - 如何通过 php/ajax 使用数组搜索 mysql 数据库?
- sharepoint - How to search for specific items in a SharePoint list?
- flutter - 是否可以通过按住拖动来移动 Flutter TabBar 中的选项卡?
- angular - 如何以角度模拟子对象
- python-3.x - 通过第一个非 NaN 元素将矩阵的行向左/向右对齐
- python - 如何从python中的对象中删除特定字符串?
- php - mysqli_stmt_get_result() 出现致命错误,nd_mysqli 已安装
- python - 对于树中的每个节点,为每个节点添加下划线,以便覆盖所有子节点
- c++ - 标准 c++ 库文件夹中的元组文件已损坏。如何修改?