Swift json时间值到当地时区

时间:2015-12-03 04:56:07

标签: json swift nstimezone

我有一个json请求,可以生成两种不同类型的时间值。这两种方式都是UTC时间,但我需要将其转换为当地时间。

2015-12-01T13:05:33+00:00

1:05:33 PM

我的尝试。

let dateFormatter = NSDateFormatter()
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle //Set time style
dateFormatter.timeZone = NSTimeZone()
let localDate: NSDate? = dateFormatter.dateFromString(time1)
print(localDate)

这就是我得到的结果。 2000-01-01 19:05:33 +0000如果我使用1:05:18 PM值。

获取json值的行。

let time1 = json["results"]["time1"].string!

2 个答案:

答案 0 :(得分:1)

好的,有几件事情:

  1. 解析RFC 3339 / ISO 8601字符串:

    let string = "2015-12-01T13:05:33+00:00"
    
    let rfc3339Formatter = NSDateFormatter()
    rfc3339Formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    rfc3339Formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    let date = rfc3339Formatter.dateFromString(string)
    

    注意,我已设置了区域设置(根据Technical Q&A 1480)。但由于日期字符串包含时区信息,因此我可以使用Z格式化程序字符,以便正确解释时区。

  2. NSDate个对象的时区与之关联。实际上,如果我们在上一步中成功解析了print(date),它将向我们显示GMT / UTC中的NSDate,即使该原始字符串位于不同的时区。

    只有在使用格式化程序将此NSDate转换回要呈现给用户的新字符串时,时区才有意义。所以我们可以使用单独的格式化程序来创建输出字符串:

    let userDateFormatter = NSDateFormatter()
    userDateFormatter.dateStyle = .MediumStyle
    userDateFormatter.timeStyle = .MediumStyle
    let outputString = userDateFormatter.stringFromDate(date!)
    

    因为它没有指定时区,所以它将在用户的本地时区创建一个字符串。由于我们不会覆盖locale并使用.dateStyle.timeStyle,因此在创建要呈现的字符串时,它会使用设备的当前本地化设置显示它给最终用户。

  3. 现在,如果你真的在UTC中接收时间(没有包含时区?!yikes,那么在JSON,恕我直言,这是一个非常糟糕的设计),那么你必须指定时间区:

    let string = "1:05:33 PM"
    
    let utcTimeStringFormatter = NSDateFormatter()
    utcTimeStringFormatter.dateFormat = "hh:mm:ss a"
    utcTimeStringFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
    let time = utcTimeStringFormatter.dateFromString(string)
    

    现在我们有timeNSDate包含该字符串所代表的时间。但同样,NSDate个对象本身并没有时区。只有当我们将其转换回最终用户的字符串时,我们才能看到当地时区的时间:

    let userTimeFormatter = NSDateFormatter()
    userTimeFormatter.timeStyle = .MediumStyle
    let outputString = userTimeFormatter.stringFromDate(time!)
    

答案 1 :(得分:0)

您可以尝试设置本地时区或设置GMT

formatter.timeZone = NSTimeZone.localTimeZone()
  

OR

formatter.timeZone = NSTimeZone(abbreviation: "GMT")

请告诉我,如果您仍然面临错误!