NSDateFormatter崩溃。怎么会?

时间:2012-05-16 00:54:38

标签: objective-c ios cocoa nsdateformatter date-formatting

    NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [timeFormatter setDateFormat:@"h:mm a"];
    NSString *fullTime = [timeFormatter stringFromDate:someDateHere];
    NSArray *timeParts = [fullTime componentsSeparatedByString:@" "];
    timeLabel.text = [timeParts objectAtIndex:0];
    ampmLabel.text = [timeParts objectAtIndex:1];

最后一行与

崩溃
    NSRangeException*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]

这怎么可能?对此代码之前返回的日期进行零检查。

2 个答案:

答案 0 :(得分:3)

从“数据格式指南”文档(日期格式化程序部分>使用格式字符串指定自定义格式>固定格式):

  

虽然原则上格式字符串指定了固定格式,但默认情况下NSDateFormater仍会考虑用户的首选项(包括语言环境设置)。   ...   在iOS中,用户可以覆盖默认的AM / PM与24小时时间设置。这可能导致NSDateFormatter重写您设置的格式字符串。

换句话说,在设置为24小时时间设置的iOS设备上,即使你指定了“h:mm”,你也不会得到“下午6:02”,你会得到“18:02”一个”。所以当你用空格分隔时,你会得到一个单独的值,“18:02”,而不是两个值。

答案 1 :(得分:1)

documentation for NSDateFormatter中有一个警告说:

  

请注意,尽管原则上设置格式字符串(setDateFormat:)指定了一种确切的格式,但实际上它也可能会被用户的偏好覆盖 - 有关详细信息,请参阅Data Formatting Guide

这适用于你的情况下产生一个没有任何空格的字符串吗? (当用空格分割时,这将导致长度为1的数组,给出您在看到的位置看到的异常。)通过记录格式化日期或附加调试器来检查这一点。

请注意,the page on date formats的结尾确实建议在处理未定位的日期/时间时使用普通的旧strftime_l。那可能更适合你。 (另外,你想在计算机绑定的数据中使用AM / PM指示器吗?严重吗?24小时时钟通常更容易使用...)