为什么NSFormatter dateFromString偶尔会返回nil?

时间:2015-04-14 23:32:32

标签: ios nsdate nsdateformatter nslocale

我有一种方法可以将特定格式的字符串转换为NSDate,但它偶尔会返回nil。

- (NSDate *)dateFromString:(NSString *)dateAndTime
{
    NSDate *date;

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"MM/dd/yyyy hh:mm a"];

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [formatter setTimeZone:gmt];

    date = [formatter dateFromString:dateAndTime];

    return date;
}

这从我所知道的大部分时间起作用,但是它失败的时间百分比。

我一直在跟踪这个错误,所以有一些代码会在发生这种情况时让应用程序崩溃。崩溃报告告诉我使方法返回的值为零。

例如,我收到一份崩溃报告,告诉我" 4/14/2015 7:35 PM"没过了。

当我为每个日期硬编码相同的值时,它在我的计算机上以调试模式运行应用程序时有效。

这可能会发生什么?我没有报道NSDate的某些案例吗?为什么它不会在每台设备上发生?

1 个答案:

答案 0 :(得分:2)

首先,4/14/2015 7:35 PM的日期字符串可能是M/d/yyyy h:m aM/dd/yyyy h:mm ahttp://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns

其次,建议将NSLocale设置为NSDateFormatter。

formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];

当我和一个中国人一起工作时,我遇到了同样的问题,即NSDate设置为nil。它只发生在特定设备上,问题是区域设置。

要重现此问题,请按以下步骤操作:

  1. 转到“设置应用”
  2. 一般 - >语言与地区 - >高级
  3. 关闭自动
  4. 将语言更改为Chinese, Simplified
  5. 再次执行您的应用。如果没有设置NSLocale,你会发现NSDate总是为零。