为啥 NSFormatter dateFromString 偶尔会返回 nil?

Posted

技术标签:

【中文标题】为啥 NSFormatter dateFromString 偶尔会返回 nil?【英文标题】:Why is NSFormatter dateFromString occasionally returning nil?为什么 NSFormatter dateFromString 偶尔会返回 nil? 【发布时间】:2015-04-14 23:32:31 【问题描述】:

我有一种方法可以将特定格式的字符串转换为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;

据我所知,这在大多数情况下都有效,但有一定比例的时间会失败。

我已经跟踪这个错误一段时间了,所以有一些代码会在发生这种情况时使应用程序崩溃。崩溃报告告诉我使该方法返回 nil 的值。

例如,我收到一份崩溃报告,告诉我“4/14/2015 7:35 PM”返回 nil。

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

这里会发生什么?我没有为NSDates 报道一些案例吗?为什么不是在每台设备上都发生这种情况?

【问题讨论】:

“4/14/2014”与“MM/dd/yyyy”不匹配。 “04/14/2014”将匹配。您还需要将语言环境设置为“en_US_POSIX”。此处的许多讨论和 Apple 的文档中都涵盖了这一需求。 ***.com/questions/6613110/… 【参考方案1】:

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

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

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

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

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

    进入设置应用 常规 -> 语言和地区 -> 高级 自动关闭 将语言更改为Chinese, Simplified 再次执行您的应用程序。如果未设置 NSLocale,您会发现 NSDate 始终为零。

【讨论】:

语言环境需要是“en_US_POSIX”,而不仅仅是“en_US”。 @rmaddy 谢谢你的建议。答案已更新:D 是的 - 我能够根据您的建议重现该问题。我唯一不清楚的(即使在您发布的文档之后)是 M 和 MM 之间的区别。无论使用 MM,应用程序现在似乎都在工作,因为我设置了语言环境。

以上是关于为啥 NSFormatter dateFromString 偶尔会返回 nil?的主要内容,如果未能解决你的问题,请参考以下文章

Foundation框架 - NSNumber类

NSDateFormatter常见的使用方式

什么值会在文本字段上显示为无穷大?

COCOA - 如何在NSTextfield中达到最大长度时,文本字段不允许输入文本?

在Swift或Objective-C中将大型混合数字和文本数字转换为数字

你应该同步运行方法吗?为啥或者为啥不?