Writing an iPhone app in Objective-C, I have a date in string form (in UTC format, with a Z on the end to denote zero UTC offset, or zulu time), which I need to parse into an NSDate
object.
A bit of code:
NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
NSString* str = @"2009-08-11T06:00:00.000Z";
NSDate* date = [df dateFromString:str];
Running this through the debugger, date
ends up nil
! I'm assuming it has something to do with my date format string.How can I fix it to correctly parse the date string?
A thought would be to make the
Z
in the date format literal, a la setting the date format to yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
.That would work, except when the Z is parsed as a literal, the date loses offset information, and so is ambiguous, and therefore interpreted to be local time.
For example, if the string to parse was 2009-08-11T06:00:00.000Z (6:00 zulu time) it would be interpreted as 6:00 local time, and an incorrect offset would then be applied. It would then be parsed as 2009-08-11T06:00:00.000-600 (12:00 zulu time) with the offset depending on the user's offset.
Thanks!
I think you need to put single quotes around the Z in the format string, because the Z actually means something to the formatter and you want it to represent a literal character instead.
this may help you.. the "Z" is a literal for the time zone code. try using "o" (the letter, not zero). The literal "o" means UTC offset. I ran into this a while back, I hope this helped you.
There's no need to manipulate the string. Simply set the time zone on the
NSDateFormatter
(and the locale while you're at it):And parse date strings as needed:
You can use this method to get date from UTC.
}
Most answers suggest you to treat 'Z' as a literal character. Do not do this!
The Z actually means that the date is offset by 0 to UTC (+0000).
This is according to the time zone format ISO8601:
What you want to do is use the following format for your NSDateFormatter:
By repeating the Z five times, you tell the formatter to use ISO8601 when parsing the string.
Bonus:
For more information check this document.