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]
这怎么可能?对此代码之前返回的日期进行零检查。
答案 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小时时钟通常更容易使用...)