如何parsingdatestring到iOS中的NSDate对象?

我想parsing从XML XMLdatestring到iPhone应用程序中的NSDate对象

我知道这一定是以前曾经问过的,但是,我相信我有正确的语法,但是它不起作用。 我的代码有问题吗?

我需要parsing的datestring是:

2011-01-21T12:26:47-05:00 

我用来parsing它的代码是:

 self.dateFormatter = [[NSDateFormatter alloc] init]; [self.dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; [self.dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; ... else if([elementName isEqualToString:kUpdated]){ self.currentQuestion.updated = [self.dateFormatter dateFromString:self.currentParsedCharacterData ]; } 

任何帮助不胜感激。 谢谢!

**基于来自ChrisKent的链接引用,我解决了这样的问题:

 else if([elementName isEqualToString:kLastOnDeck]){ NSString *dateStr = self.currentParsedCharacterData; // we need to strip out the single colon dateStr = [dateStr stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([dateStr length] - 5,5)]; self.currentQuestion.lastOnDeck = [dateFormatter dateFromString:dateStr]; } 

你不需要接近尽可能多的单引号(只需要非date/时间字符),所以改变这一点:

 [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 

对此:

 [self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; ... self.currentQuestion.updated = [self.dateFormatter dateFromString:[self.currentParsedCharacterData stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([self.currentParsedCharacterData length] – 5,5)]]; 

文档在这里: https : //developer.apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1

Unicode格式模式: http : //unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

使用冒号处理时区(+00:00): http : //petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/

最后,我和冒号有同样的问题。 这是我用来标准化date以使NSDate快乐的function。

 /** * Timezones are returned to us in the format +nn:nn * The date formatter currently does not support IS 8601 dates, so * we convert timezone from the format "+07:30" to "+0730" (removing the colon) which * can then be parsed properly. */ - (NSString *)applyTimezoneFixForDate:(NSString *)date { NSRange colonRange = [date rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@":"] options:NSBackwardsSearch]; return [date stringByReplacingCharactersInRange:colonRange withString:@""]; } 

我花了一段时间才find这个简单的答案。 而且还有很多涉及引入额外第三方代码的解决scheme。

对于那些正在为此而苦恼的人,只支持iOS 6及以上版本。

您可以将date格式化程序设置为

 [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"] 

这样可以正确处理冒号的“-05:00”。

解决scheme是改变:

 [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 

对此表示法:

 [self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; 

我希望它能帮助你。

ISO8601DateFormatter

我可以用CocoaPod的这个库获得很大的成功。

https://github.com/boredzo/iso-8601-date-formatter

用法

 - (ISO8601DateFormatter *)dateFormatter { static ISO8601DateFormatter *dateFormatter = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ dateFormatter = [[ISO8601DateFormatter alloc] init]; dateFormatter.includeTime = YES; }); return dateFormatter; } NSDate *date = [[self dateFormatter] dateFromString:@"2015-05-09T13:06:00"]; 

问题是最后的'Z'。 你用这种方式写在引号中,你的parsing器在你的时间string中需要一个文字字符Z,而不是一个。 你想要的是没有引号的Z格式化字符,这表示你的时间string包含时区信息。 它的作用是,string末尾的-05:00是时区。

由于您期望的时区信息,因此在date格式化程序中设置时区是毫无意义的。 并检查链接到Unicode格式的模式,该链接包含您应该信任的权威性信息,超过您在这里得到的所有答案。

从iOS 10开始,系统提供了NSISO8601DateFormatter可用于这种特殊的格式。