У меня есть код, который я использую для сортировки календарных дат, который выглядит следующим образом:
#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:]: дата не может быть нулевой
Я имею в виду, что вы думаете, что эта операция должна означать нулевую дату?
Исключения пока удалось избежать.
О некоторых из этих ошибок будет сообщено вместе с этой жалобой, а затем дальнейшие нарушения будут просто молча выполнять любые случайные действия, возникающие из нуля. Вот след того, где это произошло на этот раз (некоторые кадры могут отсутствовать из-за оптимизации компилятора):
Вы должны смеяться над этим, но я не уверен, что не так с моим 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
чтобы работать на международном уровне.
источник
formatString
?inputDate
должна быть у васnil
. Посмотрите на кадры более высокого стека и посмотрите, сможете ли вы выяснить, что может отправитьnil
дату ввода.Ответы:
Ошибка не возникает в опубликованном вами коде. Это означает, что где-то у вас есть что-то, что должно быть,
NSDate
а вместо этого этоnil
.Что касается юмора в сообщении об ошибке, я никогда не видел этого сообщения, но +1 к Apple. Некоторые инженеры из подразделения Cocoa столь же забавны, как и старые добрые инженеры Apple, которых много лет назад было.
Посмотрите, какой вид диагностики компилятор Apple MPW C использовал для вывода http://www.netfunny.com/rhf/jokes/91q3/cerrors.html
источник
[fmt setDateFormat:@"HH:mm dd MMM yyyy"];
оно работает нормально. Так что я предполагаю, чтоdateFormatFromTemplate:
это в каком-то смысле неправильно.Большое спасибо 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
выглядело после локализации.Который формат после локализации может выглядеть по-разному после локализации.
Таким образом, передавая строку в формате
HH:mm dd MMM yyyy
заставляла ее возвращатьсяnil
.Что сейчас очевидно -.-
Поэтому вместо локализации при создании даты я создаю даты в стандартном формате
HH:mm dd MMM yyyy
. Затем при отображении я форматируюNSDate
для пользователей соответствующей локали.источник