如何从Firestore服务器时间戳中提取本地时间?

时间:2020-07-20 15:02:12

标签: swift firebase google-cloud-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小时。

同样,时间戳转换成功,但提取时间不是字符串部分。

1 个答案:

答案 0 :(得分:0)

原来,我不必使用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)