Получите только выходные между двумя датами - PullRequest
0 голосов
/ 26 января 2012

Я пытаюсь получить только субботу и воскресенье между двумя датами, но я не знаю, почему мне дают свободные дни недели.

Вот мой код:

- (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");
        }


    }

}

Проблема: Проблема была вызвана NSTimeInterval interval = i; Логика цикла for заключалась в повторении по дням. Установка временного интервала для итерации по секундам.

Из документации по NSTimeInterval

NSTimeInterval всегда указывается в секундах;

Ответ:

Изменение строки NSTimeInterval на

NSTimeInterval interval = i*24*60*60;

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Вот ссылка на другой ответ Я написал на SO (бесстыдно, я знаю). Он имеет некоторый код, который может помочь вам с датами в будущем. Методы реализованы как категории NSDate, то есть они становятся методами NSDate.

Есть несколько функций, которые помогают с выходными. Но эти два могут быть наиболее полезными:

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

Они возвращают дату выходных после и до получателя (самостоятельно).

Как правило, вы не должны использовать понятие, что день составляет 86400 секунд, и должны использовать NSDateComponents и NSCalendar. Это работает, даже когда переходы на летнее время происходят между датами. Как это:

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

    NSCalendar *theCalendar = [NSCalendar currentCalendar];
    return [theCalendar dateByAddingComponents:dayComponent toDate:self options:0];
}
1 голос
/ 27 января 2012

Важно помнить, что один день не обязательно равен 24 * 60 * 60 секундам. И вы не должны делать арифметику даты самостоятельно

То, что вам действительно нужно сделать, может показаться немного утомительным, но это правильная вещь: используйте NSCalendar и – dateByAddingComponents:toDate:options:

См. Календарные расчеты Справочник.

...