#cocoa #nsdate #nscalendar
#cocoa #nsdate #nscalendar
Вопрос:
как я могу проверить, существует ли конкретная дата?. Например, если я сделаю следующее:
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setYear:2011];
[dateComponents setMonth:2];
[dateComponents setDay:29];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:dateComponents];
[dateComponents release];
NSLog(@"date: %@", date);
Я просто получу 1 марта. Я не могу найти функцию, которая позволяет это, единственный способ, которым я могу это сделать, — проверить после создания NSDate, соответствуют ли компоненты тому, что я заказал
Ответ №1:
Вы могли бы использовать -[NSDateFormatter dateFromString:]
метод:
(BOOL)dateExistsYear:(int)year month:(int)month day:(int)day
{
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyyMMdd";
NSString* inputString = [NSString stringWithFormat:@"M--",
year,month,day];
NSDate *date = [dateFormatter dateFromString:inputString];
return nil != date;
}
Если вы укажете действительную дату, то dateFromString:
все пройдет успешно, в противном случае она вернется nil
.
Комментарии:
1. Это работает. Хотя используйте
"ddd"
для обнуления чисел.
Ответ №2:
(BOOL)dateExistsYear:(int)year month:(int)month day:(int)day{
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:year];
[components setMonth:month];
[components setDay:day];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:components];
[components release];
components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:date];
if([components year] != year || [components month] != month || [components day] != day){
return NO;
}
else{
return YES;
}
}
Я проверил существование всех дней с 1 января 2000 года по 12 декабря 2012 года.
2011-04-28 11:42:57.130 Протестировать [1543:903] интервал 1.103822 // используя вышеуказанную функцию 2011-04-28 11:42:59.498 Тест[1543:903] интервал 2.367271 // с использованием dateformatter
Все равно быстрее просто проверять компоненты.
Комментарии:
1. Верхним пределом для вашего теста действительно должно быть 21 декабря 2012 . 😉