我有一些用于排序日历日期的代码,如下所示:
#if !(TARGET_IPHONE_SIMULATOR)
NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
locale:[NSLocale currentLocale]];
[fmt setDateFormat:formatString];
#else
[fmt setDateFormat:@"HH:mm dd MMM yyyy"];
#endif
如果我在模拟器中运行,一切正常。如果我在设备上运行它,则会收到此讽刺调试消息。
2012-09-19 22:40:13.972 APPNAME [4923:907] * -[__ NSCFCalendar components:fromDate:]:日期不能为零
我的意思是,您认为该操作应以零日期表示什么?
现在已经避免了异常。
这些错误中的一些错误将在此投诉中报告,然后进一步的违规将简单地无提示地执行nil导致的任何随机操作。这是这次发生的回溯(由于编译器优化,某些帧可能会丢失):
您必须嘲笑它,但是我不确定我的dateFormatFromTemplate:
代码有什么问题。任何帮助,将不胜感激。
运行Xcode V 4.5 btw
更新:
回溯:
0 CoreFoundation 0x39ff0e55 + 84
1 APPNAME 0x00040be1-[MeetingsViewController dateAtBeginningOfDayForDate:] + 140
所以我想我的dateAtBeginningOfDayForDate
方法会变坏。看起来像这样:
/*
Break down a given NSDate to its bare components for sorting
*/
- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate
{
// Use the user's current calendar and time zone
NSCalendar *calendar = [NSCalendar currentCalendar];
NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
[calendar setTimeZone:timeZone];
// Selectively convert the date components (year, month, day) of the input date
NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:inputDate];
// Set the time components manually
[dateComps setHour:0];
[dateComps setMinute:0];
[dateComps setSecond:0];
// Convert back
NSDate *beginningOfDay = [calendar dateFromComponents:dateComps];
return beginningOfDay;
}
我使用这种方法将给定的NSDate分解为其核心组件,以便可以更高效地对它们进行排序。但是,我的应用程序必须具有国际性,这就是使用它NSLocale
来格式化日期输出的原因。从表面上看,我将需要改变自己的dateAtBeginningOfDayForDate
身份以从事国际工作。