NSDateFormatter不会使用包含冒号的时区解析字符串

MMM*_*MMM 0 parsing cocoa-touch objective-c nsdateformatter

我正试图转变@"Fri, 26 Aug 2011 10:51:00 +02:00"为NSDate:

[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
NSDate *date = [dateFormatter dateFromString:dateString];
Run Code Online (Sandbox Code Playgroud)

我得到nil了结果; 我究竟做错了什么?

sc0*_*10n 6

您可以使用getObjectValue:forString:range:error:方法来解析时区中包含冒号的日期:

// test date formatting
NSString *dateString = @"2012-04-11T18:34:19+00:00";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *date;
NSError *error;
[formatter getObjectValue:&date forString:dateString range:nil error:&error];
Run Code Online (Sandbox Code Playgroud)


alb*_*amg 5

时区中的冒号(+02:00)是个问题.根据Unicode标准# 35,1*3大写Z模式表示RFC 822时区.RFC 822时区表示与GMT(或UTC)的偏移量,并具有以下格式:

zone             =  "UT"  / "GMT"                ; Universal Time
                 ...
                 ...
                 / ( ("+" / "-") 4DIGIT )        ; Local differential
                                                 ;  hours+min. (HHMM)
Run Code Online (Sandbox Code Playgroud)

如您所见,时区的小时和分钟之间没有冒号.因此,时区应该是+0200.

最合适的解决方案是首先生成符合Unicode标准的日期字符串,但如果您遇到此格式,则可能需要在将日期字符串传递给日期字符串之前对其进行预处理NSDateFormatter.

例如,快速修复将stringByReplacingOccurrencesOfString用于摆脱时区中的冒号:

// dateString --> Fri, 26 Aug 2011 10:51:00 +02:00
dateString = [dateString stringByReplacingOccurrencesOfString:@":" 
                                                   withString:@"" 
                                                      options:0
                                                        range:NSMakeRange(25, [dateString length] - 25)];
// dateString --> Fri, 26 Aug 2011 10:51:00 +0200
[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
NSDate *date = [dateFormatter dateFromString:dateString];
// date --> 2011-08-26 08:51:00 +0000
Run Code Online (Sandbox Code Playgroud)