NSDateFormatter dateFromString Always Returns nil
According to NSDateFormatter documentation :
When working with fixed format dates, such as RFC 3339, you set the dateFormat property to specify a format string.
If your date format is 2017-06-16T17:18:59.082083Z
then dateFormat
property should look like this yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ
.
Swift 3
let dateFormatter = DateFormatter()
let date = "2017-06-16T17:18:59.082083Z"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"
let result = dateFormatter.date(from: date) // 2017-06-16 17:18:59 +0000
Yet another way to get nil is if you use hh
and your hours are on the 24 hr clock and > 12, in that case, you need HH
(or H
, for zero-padded).
That is:
- Format: yyyy-MM-DD hh:mm:ss, string: "2016-03-01 13:42:17" will return nil
- Format: yyyy-MM-DD HH:mm:ss, string: "2016-03-01 13:42:17" will return the date you expect.
Hat-tip to @neilco (see comments below his answer) for this. If you like this answer, please up-vote his, too.
There are two issues here:
The format of date string the formatter is expecting (
@"yyyy-MM-dd hh:mm:ss"
) is different from the format of the date string you're trying to parse (@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz"
).Setting the formatter's locale to
[NSLocale systemLocale]
is causing[dateFormat dateFromString:]
to returnnil
. Set it to[NSLocate currentLocale]
.
The full code for the formatter should be:
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormat setLocale:[NSLocale currentLocale]];
[dateFormat setDateFormat:@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz"];
[dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];
NSDate *date = [dateFormat dateFromString:dateString];