复制自我在这里回答的类似问题:NSDateFormatter 在 iOS 3.0 中为 @"dd-MM-yy" 返回 nil
如果您使用用户可见的日期,则应避免设置日期格式字符串。以这种方式格式化日期是不可本地化的,并且无法预测您的格式字符串将如何在所有可能的用户配置中表示。相反,您应该尝试限制自己设置日期和时间样式(通过 -[NSDateFormatter setDateStyle:] 和 -[NSDateFormatter setTimeStyle:])。
另一方面,如果您使用的是固定格式的日期,则应首先将日期格式化程序的语言环境设置为适合您的固定格式的内容。在大多数情况下,选择的最佳语言环境是“en_US_POSIX”,这是一种专门设计用于生成美国英语结果的语言环境,无论用户和系统偏好如何。“en_US_POSIX”在时间上也是不变的(如果美国在未来的某个时候改变了它格式化日期的方式,“en_US”将改变以反映新的行为,但“en_US_POSIX”不会),并且在机器之间( "en_US_POSIX" 在 iPhone OS 上的工作方式与在 Mac OS X 上的工作方式相同,在其他平台上也一样)。
将“en_US_POSIX”设置为日期格式化程序的语言环境后,您可以设置日期格式字符串,日期格式化程序将对所有用户保持一致。
上述信息及更多信息可在 Apple 的技术问答 QA1480中找到
这是我的应用程序中实现上述建议的代码片段:
static NSDateFormatter* dateFormatter = nil;
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc]
initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
NSAssert(enUSPOSIXLocale != nil, @"POSIX may not be nil.");
[dateFormatter setLocale:enUSPOSIXLocale];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000";
}