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

标签 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 似乎只接受输出日期的时区信息,我无法从输入字符串中获取数字偏移量。

最佳答案

“不言自明”的例子

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 代表相同的值(时间)

关于swift - 在 Swift 中从 ISO-8601 字符串中提取偏移值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36416529/

相关文章:

ios - 我们可以在 UITextField 的扩展中调用委托(delegate)吗

ios - 全景 View iOS

swift - 自定义 NSDateFormatter.timeZone - Swift

objective-c - NSTimeInterval 到 NSDate

ios - 工作日本地通知未触发

iphone - NSDateFormatter 返回意外结果

ios - Swift:将开始和结束日期格式化为单个字符串

ios - 对两个项目目标进行相同的单元/UI 测试?

ios - 如何在 Swift 模型中存储 JSON 响应

objective-c - 为什么我的时区没有保存到我的 NSDate 中?