Pregunta

¿Cómo puedo verificar si existe una fecha en particular? Por ejemplo, si hago lo siguiente:

 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);

Solo obtendré el 1 de marzo. No puedo encontrar una función que permita esto, la única forma en que puedo hacerlo, es verificar después de crear el NSDATE si los componentes están de acuerdo con lo que ordené

¿Fue útil?

Solución

Podrías usar el -[NSDateFormatter dateFromString:] método:

+ (BOOL)dateExistsYear:(int)year month:(int)month day:(int)day
{
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    dateFormatter.dateFormat = @"yyyyMMdd";

    NSString* inputString = [NSString stringWithFormat:@"%4d%2d%2d",
                        year,month,day];

    NSDate *date = [dateFormatter dateFromString:inputString];

    return nil != date;
}

Si da una fecha válida, entonces dateFromString: tendrá éxito, de lo contrario, volverá nil.

Otros consejos

+(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;
    }
}

He verificado la existencia de todos los días desde el 1 de enero de 2000 hasta el 12 de diciembre de 2012.

2011-04-28 11:42:57.130 Test[1543:903] interval 1.103822 // using the above function  
2011-04-28 11:42:59.498 Test[1543:903] interval 2.367271 // using dateformatter

Todavía es más rápido verificar los componentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top