Objective c NSDateFormatter将不分析包含冒号的时区的字符串

Objective c NSDateFormatter将不分析包含冒号的时区的字符串,objective-c,cocoa-touch,parsing,nsdateformatter,Objective C,Cocoa Touch,Parsing,Nsdateformatter,我正在尝试将“2011年8月26日星期五10:51:00+02:00”转换为一个NSDate: [dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"]; NSDate *date = [dateFormatter dateFromString:dateString]; 结果我得到了nil;我做错了什么?时区中的冒号(+02:00)是问题所在。根据图,1..3大写Z表示a。RFC 822时区表示与GMT(或UTC)的偏移量,格式如

我正在尝试将“2011年8月26日星期五10:51:00+02:00”转换为一个
NSDate

[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
NSDate *date = [dateFormatter dateFromString:dateString];

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

时区中的冒号
(+02:00)
是问题所在。根据图,1..3大写Z表示a。RFC 822时区表示与GMT(或UTC)的偏移量,格式如下:

zone             =  "UT"  / "GMT"                ; Universal Time
                 ...
                 ...
                 / ( ("+" / "-") 4DIGIT )        ; Local differential
                                                 ;  hours+min. (HHMM)
如您所见,时区的小时和分钟之间没有冒号。因此,时区应为
+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

是的,这是一个常见的问题。许多服务器在时区中生成带有冒号的日期,据我所知,NSDateFormatter无法接受它。解决方法是按照建议,以某种方式切掉冒号。

不需要字符串操作。将格式字符串更改为:

[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z:00"];

我测试了它,它解析了你给出的日期。当我使用[NSDate description]打印日期时,我得到2011-08-26 08:51:00+0000,这相当于字符串中给出的日期

您可以使用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];

时区(
+02:00
)中的冒号是问题所在。根据,时区应为
+0200
。与错误记录的UTC日期一致,不应有分隔符小时和分钟。我的字符串是标准字符串。。。我不能改变它,我不得不偶尔做一些字符串操作,就像在第一条评论中那样,以使用NSDateFormatter。当然,您可以复制字符串并根据标准对其进行修改。您可以为时区指定ZZZZZ,即使使用冒号也可以正确解析。在印度,有些时区甚至不超过小时数,例如+05:30,因此这不是一个好的通用解决方案。是的,而且从来就不是这样,但它可能满足OP的需要,并且比从字符串中删除字符更容易。不起作用,结果是2016-11-01T00:00:00-0700:00