我有一些代码用于对日历日期进行排序,如下所示:
#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 组件:fromDate:]:日期不能为零
我的意思是真的,你认为这个操作对于一个 nil 日期应该意味着什么?
目前已经避免了一个例外。
此投诉将报告其中一些错误,然后进一步的违规行为将简单地默默地执行 nil 导致的任何随机事情。这是这次发生这种情况的回溯(由于编译器优化,某些帧可能会丢失):
你不得不笑,但我不确定我的dateFormatFromTemplate:
代码有什么问题。任何帮助,将不胜感激。
运行 Xcode V 4.5 顺便说一句
更新:
回溯:
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
的国际工作。