如何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可用于这种特殊的格式。
- 如何禁用Xcode 9中的字体平滑?
- 以编程方式返回到Swift中以前的ViewController
- 使用UINavigationController在UIPageViewController中下载内容
- parsing来自didReceiveRemoteNotification的警告:fetchCompletionHandler
- 如何在Android / iOS中释放组件
- 以编程方式拨打具有访问代码的电话号码
- iOS 6的Facebook发布程序结束与“remote_app_id不匹配存储的ID”
- iOS 7:不推荐使用MPMusicPlayerController。 如何改变设备的音量?
- iOS:比较两个date