83

我有一些代码用于对日历日期进行排序,如下所示:

#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的国际工作。

4

2 回答 2

16

您发布的代码中不会发生该错误。这意味着在某个地方你有一些东西应该是 anNSDate而不是nil.

至于错误消息中的幽默,我从未见过该消息,但对 Apple +1。Cocoa 部门的一些工程师和 Apple 很久以前的优秀老工程师一样有趣。

查看 Apple 的 MPW C 编译器用于吐出http://www.netfunny.com/rhf/jokes/91q3/cerrors.html的诊断类型

于 2012-09-20T04:05:07.567 回答
6

非常感谢nneonneo帮助我解决这个问题。

我的问题是我的应用程序必须在国际上工作,所以我需要显示与用户位置相关的日期。我以为我会NSDateFormatter为用户区域设置创建一个,然后像这样传递一个字符串日期:

 NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
                                                              locale:[NSLocale currentLocale]];
date = [fmt dateFromString:[NSString stringWithFormat:@"%@ %@", obj.meetingTime, obj.meetingDate]];

但是,问题是我在传入字符串日期之前对日期格式进行了本地化。就我而言NSDateFormatter,本地化后看起来像这样。

MMM dd, yyyy, HH:mm

本地化后的格式在本地化后可能看起来有很多不同的方式。

因此,传入格式为的字符串HH:mm dd MMM yyyy会导致它返回nil

现在很明显 -.-

因此,我没有在创建日期时进行本地化,而是使用标准格式创建日期HH:mm dd MMM yyyy。然后在显示时,我将其格式化NSDate为用户各自的语言环境。

于 2012-09-20T05:11:16.397 回答