2015-07-03 49 views
0

我有我收到的字符串,每当有新的远程通知时收到。我使用解析我的后端。我检索到的字符串来自“createdAt”列。如何将字符串转换为NSDate?

我试过下面的代码:

var ca = "2015-07-03T03:16:17.220Z" 
    var dateFormater : NSDateFormatter = NSDateFormatter() 
    dateFormater.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" 
    let date = dateFormater.dateFromString(ca) 

    println(date) 

但println的是给我无,我觉得有什么不对我的日期格式。我怎样才能解决这个问题?

+0

看起来像是ISO 8601的日期。您可能只想使用Peter Hosey的[开放源代码和广泛使用的ISO 8601日期格式化器](https://github.com/boredzo/iso-8601-date-formatter) –

+0

请参阅:[ICU格式日期和时间](http ://userguide.icu-project.org/formatparse/datetime) – zaph

回答

5

您错过了毫秒。因此:

dateFormater.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 

注意,从日期字符串转换为NSDate的时候,你不应该引用Z。如果您引用Z,它将与文字Z字符匹配,但不会正确反映该日期字符串实际上是祖鲁/格林尼治标准时间/ UTC。


如果你想创建格式化也去其他的方式,转换NSDate对象的字符串,在这种情况下,你应该引用Z,但在这种情况下,你必须记住要明确设置时区:

dateFormater.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 
dateFormater.timeZone = NSTimeZone(forSecondsFromGMT: 0) 

顺便说一句,不要忘记设置localeApple Technical Q&A 1480

dateFormater.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
+0

好吧,没有偏移的Z默认为GMT,我没有意识到。 – zaph

+0

是的,一个非引用的资本'Z'(根据您与我们分享的[ICU格式日期和时间](http://userguide.icu-project.org/formatparse/datetime))指示格式化程序将时区解析为字符串。当它在日期字符串中遇到一个“Z”(不要与格式化字符串中的“Z”混淆)时,它会正确解析并识别为GMT/UTC。比在格式化字符串中使用文字'Z'要灵活一点。 – Rob

+0

谢谢,你的答案适合我 –