从Swift中的ISO-8601字符串中提取偏移值

时间:2016-04-05 03:18:15

标签: swift nsdate nsdateformatter

使用NSDateFormatter,如果我传入带有偏移的ISO-8601日期+时间值,它将读取偏移量并将输出调整为UTC值,如下所示:

// Setup
let formatter        = NSDateFormatter()
formatter.locale     = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"

// Test
let input     = "2016-04-16 04:12:00-0800"
let output    = formatter.dateFromString( input )
let outputStr = formatter.stringFromDate( output )
print( outputStr ) // "2016-04-15 08:12:00-0000"

到目前为止,非常好。

但我想自己得到那个偏移值。我的应用程序是一个Web服务的客户端,它保留了日期时间偏移信息,所以我必须这样做(好像我盲目地将outputStr返回到web服务,它将丢失偏移信息,因此数据库不会知道收集日期时间后的偏移量。

NSDateFormatter似乎只接受输出日期的时区信息,我无法从输入字符串中获取数字偏移量。

1 个答案:

答案 0 :(得分:0)

'自我解释'的例子

import Foundation

let formatter        = NSDateFormatter()
formatter.locale     = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd HH:mm:ssZ"

// Test
let input     = "2016-04-16 04:12:00-0800"
let output    = formatter.dateFromString( input )

// with curent time zone (system default
let outputStrL = formatter.stringFromDate( output! )

// with time zone Z+0000
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
let outputStr = formatter.stringFromDate( output! )

// with time zone Z-0800
formatter.timeZone = NSTimeZone(forSecondsFromGMT: -8 * 3600)
let outputStr1 = formatter.stringFromDate( output! )

print("My local time:", outputStrL)
print("GMT+0000 time:", outputStr)
print("GMT-0800 tume:", outputStr1)

/*
 My local time: 2016-04-16 14:12:00+0200
 GMT+0000 time: 2016-04-16 12:12:00+0000
 GMT-0800 tume: 2016-04-16 04:12:00-0800
 */

如果用任何输出字符串(outputStr,outputStrL,outputStr1)替换输入字符串,则从中创建的NSDate表示相同的值(时间)