2014-10-14 2 views
-3

Я пытаюсь получить секунды между двумя датами, для этого я использую NSDateComponents:С датой не может быть нулем в Objective-C

NSString *start = components2[0];// 2014-10-14 20:52:43 
NSString *end = components[0];// 2014-10-14 20:54:40 

NSLog(@"Start -> %@, End -> %@",start,end); 

NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
[f setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 
NSDate *startDate = [f dateFromString:start]; 
NSDate *endDate = [f dateFromString:end]; 

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components3 = [gregorianCalendar components:NSDayCalendarUnit 
                fromDate:startDate 
                 toDate:endDate 
                options:0]; 



NSLog(@"Seconds -> %ld", (long)[components3 second]); 

Но я получаю следующее сообщение об ошибке:

-[__NSCFCalendar components:fromDate:toDate:options:]: fromDate cannot be nil

+0

Ну, что говорится в сообщении - 'fromDate' равно нулю, и они этого не позволяют. Если вы посмотрите на 'startDate' (и, вероятно,' endDate' тоже), это нуль, потому что вы использовали неправильный формат даты. http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns –

+0

Если вы строго ищете секунды между двумя датами, выполните следующие действия: «NSTimeInterval secondsElapsed = [endDate timeIntervalSinceDate: startDate ] 'Но ваш вопрос действительно спрашивает:« Почему я не могу получить дату из форматирования »:) –

+0

Извините, но пользователь Rob Mayoff делает все правильно, проблема в использовании HH ... – user3781174

ответ

2

Если дата строка использует 24-часовой раз, вы должны использовать HH как часовой формат:

[f setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 

Когда NSDateFormatter не может разобрать строку даты, она возвращает nil.

Как только вы получите это, вы обнаружите, что [components3 second] имеет странное значение 9223372036854775807 (или 2147483647 на 32-битной системе), которое на самом деле NSUndefinedDateComponent. Вы не запрашивали количество секунд между датами; вы просили количество дней. Используйте NSSecondCalendarUnit, чтобы задать количество секунд.

+0

Спасибо, это работает, но я получите другую проблему, slog возвращает мне значение 2147483647, и я думаю, что это нехорошо .... – user3781174

+0

Я обновил свой ответ. –

+0

Я просто хочу сказать .. спасибо! – user3781174