Question

comment puis-je vérifier si une date donnée existe ?. Par exemple, si je fais ce qui suit:

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

Je vais 1er Mars obtenir. Je ne peux pas trouver une fonction qui permet cela, la seule façon que je peux le faire, est en vérifiant après la création du NSDate si les composants sont d'accord avec ce que j'ai commandé

Était-ce utile?

La solution

Vous pouvez utiliser la méthode -[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:@"%4d%2d%2d",
                        year,month,day];

    NSDate *date = [dateFormatter dateFromString:inputString];

    return nil != date;
}

Si vous donnez une date valide, dateFromString: réussira, sinon, il retournera nil.

Autres conseils

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

J'ai vérifié l'existence de tous les jours à partir du 1er Janvier 2000 au 12 Décembre, 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

Il est encore plus rapide juste pour vérifier les composants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top