I am trying to parse a date string from xml into an NSDate object in an iPhone app
I am aware this must have been asked before, however, I believe I have the right syntax, but it is not working. Is there a problem with my code?
The date string I need to parse is:
2011-01-21T12:26:47-05:00
The code I am using to parse it is:
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 ];
}
Any help greatly appreciated. Thanks!
**Based on the link reference from theChrisKent I fixed the problem like so:
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];
}
It took me a while to find the simple answer for this. and there are a lot of solutions that involve bringing in extra third party code.
For those who are struggling with this now and are only supporting iOS 6 and above.
You can set the date formatter to
And this will properly handle the "-05:00" with the colon.
You don't need near as many single quotes as you have (only needed on non date/time characters), so change this:
To this:
Documentation here: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1
Unicode Format Patterns: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns
Dealing with TimeZones with Colons (+00:00): http://petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/
As of iOS 10 the system provided NSISO8601DateFormatter is available for this particular format.
Solutions is to change :
To this notation :
i hope it will help you.
The problem is the 'Z' at the end. The way you are writing it within quotes, your parser expects a literal character Z in your time string, and there isn't one. What you want is the Z formatting character without quotes, which indicates that your time string contains time zone information. Which it does, the -05:00 at the end of your string is the time zone.
Since you expect time zone information, setting the time zone in your date formatter is rather pointless. And check the link to the Unicode formatting patterns, that link contains the definitive information that you should trust above all answers you get here.
I was having the same problems with the colon at the end. Here's a function I used to normalize the date to make
NSDate
happy.