CLLocation GeoFire位置时间

时间:2016-11-21 15:41:37

标签: ios firebase cllocation geofire

有谁知道如何在位置结束时打印时间?在以下代码中打印出完整位置时:

在打印位置时结果中的时间与时间location?.timestamp之间存在时间差可选:

geofire?.setLocation(location, forKey: uid) { (error) in
            if (error != nil) {
                print("An error occured: \(error)")
            } else {
                print(location)
  

结果:可选(< + xx.xxxxxx,+ xx.xxxxxxxx> +/- 5.00m(速度0.00 mps /航向-1.00)@ 21/11 / 2016,16:04:32中欧标准时间)

并仅打印出来:

print(location?.timestamp)
  

结果:可选(2016-11-21 15:04:32 +0000)

如何仅打印" 16:04:32中欧标准时间" 甚至是中欧标准时间之前的日期" 21/11/2016,16:04:32 ?谢谢

1 个答案:

答案 0 :(得分:0)

CLLocation中的时间戳只是一个Date变量。在打印位置和时间戳时,您会得到不同的结果,因为它们会被转换为两个不同的时区。

Date时间戳表示抽象时刻,没有日历系统或特定时区。另一方面,CLLocation的说明会将该时间转换为您当地的时区,以便更好地说明。它们都是等价的;一个(时间戳)显示15:04:32 GMT,另一个显示16:04:32 Central European Standard Time,即没有DST的+1 GMT。

要从时间戳中获取当地时间,您可以重新格式化Date这样的对象

    let formatter = DateFormatter()
    formatter.dateFormat = "HH:mm:ss"   // use "dd/MM/yyyy, HH:mm:ss" if you want the date included not just the time
    formatter.timeZone = NSTimeZone.local
    let timestampFormattedStr = formatter.string(from: (location?.timestamp)!)  // result: "16:04:32"

    // get timezone name (Central European Standard Time in this case)
    let timeZone = NSTimeZone(forSecondsFromGMT: NSTimeZone.local.secondsFromGMT())
    let timeZoneName = timeZone.localizedName(.standard, locale: NSLocale.current)!
    let timestampWithTimeZone = "\(timestampFormattedStr!) \(timeZoneName)" // results: "16:04:32 Central European Standard Time"

如果当地时间对您的实施至关重要,我建议您检查DST。你可以这样检查

if timeZone.isDaylightSavingTimeForDate((location?.timestamp)!) {

}