NSDateFormatter dateFromString返回nil

时间:2010-11-23 16:24:38

标签: iphone objective-c cocoa

这是我的代码:

NSString *_date = @"Tue, 23 Nov 2010 16:14:14 +0000";
NSDateFormatter *parser = [[NSDateFormatter alloc] init];
[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss '+0000'"];
[parser setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *date = [parser dateFromString:_date];

这不会运行:'date'设置为'nil'。我试过

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];

没有更多的成功......

你有什么想法吗?

提前致谢

2 个答案:

答案 0 :(得分:53)

添加以下行:

NSDateFormatter *parser = [[NSDateFormatter alloc] init];
[parser setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];

它会起作用。默认情况下,NSDateFormatter使用系统的当前区域设置,该区域设置可能会根据当前用户的首选项而有所不同。上面的日期字符串(@"Tue, 23 Nov 2010 16:14:14 +0000")包含英语单词(“Tue”,“Sep”),如果语言环境设置为英语以外的其他语言,则日期格式化程序可能无法识别这些单词。

此外,来自非西方文化的用户可能会使用使用与西方世界中使用的公历不同的日历的区域设置。如果您没有明确设置区域设置,则日期格式化程序可能能够解析日期,但结果NSDate将代表整个其他时间点。

区域设置标识符@"en_US_POSIX"用于此目的。即使@“en_US”语言环境有一天会改变其默认设置,也保证不会改变。

答案 1 :(得分:3)

时区说明符为'z',因此您的字符串应为:

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z"];