将ISO 8601时间戳转换为NSDate:如何处理UTC时间偏移?

我无法将ISO 8601时间戳转换为NSDate 。 我试图使用NSDateFormatter ,但我无法得到与时间戳结束时出现的UTC时间偏移量。 为了解释,我想将诸如以下的时间戳转换为NSDate2011-03-03T06:00:00-06:00 。 我的问题是:如何处理“-06:00”部分? 我尝试使用yyyy-MM-dd'T'HH:mm:ssZ作为我的date格式string,但它不起作用。 有什么build议么?

无需删除:的。 要处理“00:00”时区,只需要“ZZZZ”:

迅速

 let dateString = "2014-07-06T07:59:00Z" let dateFormatter = NSDateFormatter() dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ" dateFormatter.dateFromString(dateString) 

Objective-C的

 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; NSString *input = @"2013-05-08T19:03:53+00:00"; [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"]; //iso 8601 format NSDate *output = [dateFormat dateFromString:input]; NSLog(@"Date output: %@", output); 

在我的情况下,我收到了这样的事情:

“2015-05-07T16:16:47.054403Z”

我不得不使用:

“YYYY ' – ' MM ' – ' dd'T'HH ':' 毫米 ':' ss.SSSZ”

问题是时区偏移量内的:字符。 你可以明确地删除那个冒号,或者删除所有的冒号,然后继续。 例如:

 NSString *s = @"2011-03-03T06:00:00-06:00"; s = [s stringByReplacingOccurrencesOfString:@":" withString:@""]; NSDateFormatter *f = [[NSDateFormatter alloc] init]; [f setDateFormat:@"yyyy-MM-dd'T'HHmmssZZ"]; NSDate *d = [f dateFromString:s]; NSLog(@"%@", d); 

这logging:

 EmptyFoundation[5088:707] 2011-03-03 12:00:00 +0000 

这里是我使用的方法:

 -(NSDate *)dateFromISO8601String:(NSString *)dateString{ if (!dateString) return nil; if ([dateString hasSuffix:@"Z"]) { dateString = [[dateString substringToIndex:(dateString.length-1)] stringByAppendingString:@"-0000"]; } dateString = [dateString stringByReplacingOccurrencesOfString:@":" withString:@""]; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateFormat = @"yyyy-MM-dd'T'HHmmssZ"; return [dateFormatter dateFromString:dateString]; } 

将ISO 8601时间戳转换为NSDate在Swift中:

 let dateFormatter = NSDateFormatter() let inputDate = "2015-06-18T19:00:53-07:00" dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ" //iso 8601 let outputDate = dateFormatter.dateFromString(inputDate) println(outputDate!) //optional implicitly 

或者明确地说:

 if let outputDate = dateFormatter.dateFromString(inputDate) { println(outputDate) //no need ! }