Question

J'essaie d'obtenir seulement les samedis et le dimanche entre deux dates, mais je ne sais pas pourquoi me procurer des jours gratuits par semaine.

Voici mon code:

- (BOOL)checkForWeekend:(NSDate *)aDate {
    BOOL isWeekendDate = NO;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSRange weekdayRange = [calendar maximumRangeOfUnit:NSWeekdayCalendarUnit];
    NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit fromDate:aDate];
    NSUInteger weekdayOfDate = [components weekday];

    if (weekdayOfDate == weekdayRange.location || weekdayOfDate == weekdayRange.length) {
        // The date falls somewhere on the first or last days of the week.
        isWeekendDate = YES;
    }
    return isWeekendDate;
}


- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    NSString *strDateIni = [NSString stringWithString:@"28-01-2012"];
    NSString *strDateEnd = [NSString stringWithString:@"31-01-2012"];

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"dd-MM-yyyy"];
    NSDate *startDate = [df dateFromString:strDateIni];
    NSDate *endDate = [df dateFromString:strDateEnd];

    unsigned int unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *comps = [gregorian components:unitFlags fromDate:startDate  toDate:endDate  options:0];

   // int months = [comps month];
    int days = [comps day];

    for (int i=0; i<days; i++) 
    {

        NSTimeInterval interval = i;
        NSDate * futureDate = [startDate dateByAddingTimeInterval:interval];

        BOOL isWeekend = [self checkForWeekend:futureDate]; // Any date can be passed here.

        if (isWeekend) {
            NSLog(@"Weekend date! Yay!");
        }
        else
        {
            NSLog(@"Not is Weekend");
        }


    }

}

Le problème: le problème a été causé par NSTimeInterval interval = i; La logique de la boucle FOR était d'itérer par jours. Définition de l'intervalle de temps sur I itérer en quelques secondes.

À partir de la documentation sur nstimeInterval

NstimeInterval est toujours spécifié en secondes;

La réponse:

Changer le NSTimeInterval se mettre en ligne

NSTimeInterval interval = i*24*60*60;
Était-ce utile?

La solution

Voici un lien vers une autre réponse J'ai posté sur SO (Shameless, je sais). Il a un code qui pourrait vous aider avec les dates à l'avenir. Les méthodes sont mises en œuvre comme des catégories de NSDate, ce qui signifie qu'elles deviennent des méthodes de NSDate.

Il existe plusieurs fonctions qui aident les week-ends. Mais ces deux peuvent être les plus utiles:

- (NSDate*) theFollowingWeekend;
- (NSDate *) thePreviousWeekend;

Ils retournent la date du week-end suivant et avant le récepteur (soi).

Généralement, vous ne devez pas utiliser la notion selon laquelle une journée est de 86400 secondes et doit utiliser NSDateComponents et NSCalendar. Cela fonctionne même lorsque des transitions de temps d'été sur la lumière du jour se produisent entre les dates. Comme ça:

- (NSDate *) dateByAddingDays:(NSInteger) numberOfDays {
    NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
    dayComponent.day = numberOfDays;

    NSCalendar *theCalendar = [NSCalendar currentCalendar];
    return [theCalendar dateByAddingComponents:dayComponent toDate:self options:0];
}

Autres conseils

Une chose très importante à retenir est que un jour n'est pas (nécessairement) égal à 24 * 60 * 60 secondes. Et tu ne devrais pas faire dater Arithmétique toi-même

Ce que vous devez vraiment faire peut sembler un peu fastidieux, mais c'est la bonne chose à faire: utiliser NSCalendar et – dateByAddingComponents:toDate:options:

Voir Calculs calendriques guide.

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