夫特JSON时间值到本地时区

问题描述:

我有能够产生两种不同类型的时间值的JSON请求。这两种方式都是UTC时间,但我需要将其转换为当地时间。夫特JSON时间值到本地时区

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! 

OK,一两件事情事情:

  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)我们在前面的步骤成功解析,它会告诉我们,在NSDate GMT/UTC,即使原来的字符串是在不同的时区。

    一个时区,当您使用格式化这个NSDate转换回一个新的字符串被呈现给用户才有意义。因此,我们可以使用一个单独的格式创建输出字符串:

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

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

  3. 现在,如果你确实收到UTC的时间(没有包括时区?!让人惊讶,这是一个非常糟糕的设计看,在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) 
    

    现在,我们有time,包含由该字符串表示的时间NSDate。但是,NSDate对象本身并没有时区。只有当我们转换回一个字符串为最终用户会看到我们在当地时区的时间:

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

这是很大的帮助。感谢您处理这两种格式。我能够使它以任何一种格式工作。现在,我必须纠正代码,以便我可以在json文件中重复使用它。 – MwcsMac

+0

解析你的JSON时重复使用它的关键是保存那些'NSDateFormatter'对象,所以你不会反复实例化它们。 (所以,例如,避免在每次调用方法时创建一个实例化日期格式化程序的扩展)。实例化一个'NSDateFormatter'(甚至改变'dateFormat' /'dateStyle' /'timeStyle')的过程相对比较简单昂贵, – Rob

您可以通过设置你的本地时区中,或通过设置GMT

formatter.timeZone = NSTimeZone.localTimeZone() 

OR

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

只是尽量让我知道,如果你仍然面临错误!