【问题标题】:NSDateFormatter dateFromString returns nilNSDateFormatter dateFromString 返回 nil
【发布时间】:2010-11-23 16:24:37
【问题描述】:

这是我的代码:

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];

这不会运行:“日期”设置为“无”。我试过了

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

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

你有什么想法吗?

提前致谢

【问题讨论】:

  • 您的设备/模拟器设置为什么语言环境?这仅在语言环境设置为英语时才有效。
  • 我的语言环境是法语...我没想到,真丢脸 :) 有没有办法在不更改初始日期的情况下使此代码与大多数当前语言环境兼容?
  • 您可以告诉 NSDateFormatter 使用特定的语言环境进行解析(例如 en_US_POSIX)。见Apple QA1480
  • 它确实运行;它只是没有给你想要的结果。
  • @aBitObvious :谢谢,它规则

标签: iphone objective-c cocoa


【解决方案1】:

添加这一行:

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" 语言环境有一天会更改其默认设置,也保证不会更改。

【讨论】:

  • 如果您能解释为什么设置语言环境可以解决问题,那就太好了。换句话说,为什么 dateFromString 只有在语言环境设置为美国英语时才能工作?
  • @andrewap:我用解释更新了我的答案(我将我的建议从@"en_US" 更改为@"en_US_POSIX",这是更面向未来的解决方案。
  • @OleBegemann :这一行也解决了我的问题,只是我的字符串如下:2013-02-15T11:12:12Z。该字符串不包含英文单词,因此我不确定为什么需要此行才能使其正常工作。你知道我为什么要添加这一行吗?
  • @MartinMoizard 同意,我看到了同样的问题,如果没有英文单词,为什么会出现问题?不知何故是 T 还是 Z?
  • @MartinMoizard 像这样的字符串需要设置日历才能使格式化程序正常工作(日、年和月数字取决于所使用的日历),如果:当使用带有locale 设置但没有calendarNSDateFormatter 时,使用了与区域设置相关联的NSLocaleCalendar(在您的情况下,它适当地是公历)。但是,在实践中,我看不到这种行为;我需要在我的测试用例中明确设置一个日历,否则我的格式化程序不起作用,无论有没有语言环境。我现在和你一样困惑。
【解决方案2】:

时区说明符是'z',所以你的字符串应该是:

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

【讨论】:

  • 使用 z 实际上是这里最简单和干净的解决方案,恕我直言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多