Objective c NSDateFormatter将不分析包含冒号的时区的字符串
我正在尝试将“2011年8月26日星期五10:51:00+02:00”转换为一个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)的偏移量,格式如
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