2014-11-11 3 views
-1

Перед подачей downvote, прокомментируйте причину

Я создал UIDatePicker с минимальными & максимальных значениями дат (то есть 6 месяцев выбора даты) Теперь мне нужно получить 7 дней от выбранной даты. Там мне нужно проверить условия,Получит дни между днями

  • Если дата дата сегодня мне нужно получить 7 дней с сегодняшнего дня и далее
  • Если дата последней датой (т.е. последняя дата сборщика) нужно получить последние 7 дней, включая в последний день:
  • Если вы видите все фотографии и фотографии из этого города, пожалуйста, сообщите нам об этом. И также при получении последнего & следующих 3 дней он не должен превышать лимит даты выбора.

Here's my code snippet:

- (void)addDays:(NSInteger)range { 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"dd-MM-yyyy"]; 

    NSDate *startDate = self.selectedDate; 

    for (int x = 0; x <= range; x++) { 
     NSLog(@"%@", [dateFormat stringFromDate:startDate]); 
     startDate = [startDate dateByAddingTimeInterval:(60 * 60 * 24)]; 
    } 
} 

- (void)minusDays:(NSInteger)range { 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"dd-MM-yyyy"]; 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *comps = [NSDateComponents new]; 

    for (NSInteger i=0; i<range; i++) { 
     comps.day += -1; 

     NSDate *date = [calendar dateByAddingComponents:comps toDate:self.selectedDate options:0]; 
     NSDateComponents *components = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:date]; 
     NSLog(@"%@", [dateFormat stringFromDate:[calendar dateFromComponents:components]]); 
    } 
} 

- (void)calculateDateRange { 

    if ([dateArray count] > 0) { 
     [dateArray removeAllObjects]; 
    } 

    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *lastcomponents = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:[NSDate date]]; 
    lastcomponents.month += 6; 

    NSDateFormatter *formatter = [NSDateFormatter new]; 
    [formatter setDateFormat:@"yyyy/MM/dd"]; 

    NSDate *currentDate = [NSDate date]; 
    NSDate *selectedD = self.selectedDate; 
    NSDate *endDate = [calendar dateFromComponents:lastcomponents]; 

    NSDate *fromDate; 
    NSDate *toDate; 

    [calendar rangeOfUnit:NSDayCalendarUnit startDate:&fromDate interval:NULL forDate:currentDate]; 
    [calendar rangeOfUnit:NSDayCalendarUnit startDate:&toDate interval:NULL forDate:selectedD]; 
    NSDateComponents *difference = [calendar components:NSDayCalendarUnit fromDate:fromDate toDate:toDate options:0]; 
    NSInteger first = [difference day]; 

    [calendar rangeOfUnit:NSDayCalendarUnit startDate:&fromDate interval:NULL forDate:selectedD]; 
    [calendar rangeOfUnit:NSDayCalendarUnit startDate:&toDate interval:NULL forDate:endDate]; 
    NSDateComponents *difference2 = [calendar components:NSDayCalendarUnit fromDate:fromDate toDate:toDate options:0]; 
    NSInteger second = [difference2 day]; 

    if ((first == 0 || first < 3) && second > 7) { 
     [self addDays:7]; 
    } else if (first >= 3 && second > 7) { 
     [self minusDays:3]; 
     [self addDays:3]; 
    }else if (second == 7 || second < 7) { 
     [self minusDays:7]; 
    } 
} 

Это работает отлично. Но, не может получить последний последний & предыдущих дней.

У кого-нибудь есть идея?

+2

Нет, вы не можете использовать 60 * 60 * 24 для одного дня. Когда-либо. Позвольте мне добавить ответ ... – Fogmeister

+0

Пожалуйста, объясните, что «Если дата посередине сегодняшней даты и последней даты, мне нужно получить последние 3 дня, следующие 3 дня, включая сегодняшнюю дату.И, также, получая последние и следующие 3 дня, он не должен превышать лимит даты выбора. «Это ОЧЕНЬ смущает и, очевидно, не означает, что я думаю, что это значит. – Fogmeister

+0

Это значит, мой диапазон дат ** 11 ноября '14 - 11 мая'15 ** Итак, если я выберу 16 ноября'14. Мне нужно получить последние 3 дня с выбранной даты (т.е. 16 ноября 14) до следующих 3 дней с выбранной даты (13, 14, 15, 16 , 17 и 19 ноября'14), мне нужно получить его. – Praveenkumar

ответ

2

Моей интерпретация ваших потребностей

У вас есть выбор даты. Когда выбрана дата, вам нужно создать 7 дней range вокруг выбранной даты.

Итак, если выбранная дата 15/11/2014, то вы хотите 3 дней обе стороны так ...

12/11/2014 - 18/11/2014.

Однако диапазон дат не может превышать пределы выбора даты. Так что, если минимальная дата выбора даты устанавливается на 14/11/2014 затем (в приведенном выше примере) диапазон дат будет ...

14/11/2014 - 21/11/2014

Даже после дополнительных объяснений это еще мой интерпретация. И мой код делает именно это.

Решение

Вы НЕ использование 60 * 60 * 24 означает один день. Это просто неправильно. При работе с датами вы всегда должны использовать NSDateComponents и NSCalendar.

Кроме того, сломайте свою проблему на небольшие шаги. Нет никакой причины делать все в одной гигантской функции.

OK Я думаю, у вас есть действие Datepicker где-то, так что я бы его кодом, как это ...

- (void)datePickerDateChanged 
{ 
    NSDate *minimumDate = self.datePicker.minimumDate; 
    NSDate *maximumDate = self.datePicker.maximumDate; 

    NSDate *selectedDate = self.datePicker.date; 

    NSDate *startDate; 
    NSDate *endDate; 

    if ([self numberOfDaysFromDate:minimumDate toDate:selectedDate] < 3) { 
     // get 7 days after minimumDate 
     startDate = minimumDate; 
     endDate = [self dateByAddingDays:6 toDate:minimumDate]; 
    } else if ([self numberOfDaysFromDate:selectedDate toDate:maximumDate] < 3) { 
     // get 7 days before maximumDate 
     startDate = [self dateByAddingDays:-6 toDate:maximumDate]; 
     endDate = maximumDate; 
    } else { 
     // get 3 days before and 3 days after selectedDate 
     startDate = [self dateByAddingDays:-3 toDate:selectedDate]; 
     endDate = [self dateByAddingDays:3 toDate:selectedDate]; 
    } 
    // Here startDate and endDate define your date range. 

} 

- (NSDate *)dateByAddingDays:(NSInteger)days toDate:(NSDate *)date 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *components = [NSDateComponents new]; 
    components.day = days; 

    return [calendar dateByAddingComponents:components toDate:date options:0]; 
} 

- (NSInteger)numberOfDaysFromDate:(NSDate *)fromDate toDate:(NSDate *)toDate 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *components = [calendar components:NSDayCalendarUnit fromDate:fromDate toDate:toDate options:0]; 

    // always return positive. We just want magnitude of days. 
    return components.day > 0 ? components.day : -components.day; 
} 

Это непроверенное и только первая попытка.

+0

Спасибо за ваше время. Его работа прекрасна. Но, как выполнить для этого, * Если дата посередине сегодняшней даты и последней даты, мне нужно получить последние 3 дня, следующие 3 дня, включая сегодняшнюю дату. Кроме того, при получении последнего и последующих 3 дней он не должен превышать лимит даты выбора. * – Praveenkumar

+0

@Praveen взгляните на мой код. Он делает все это. – Fogmeister

+0

Нет, это не так. Мое ограничение заключается в том, что выбранная дата находится в середине минимальных и максимальных дат. Он должен получить последние 3 дня с текущей даты, следующих 3 дней, включая текущую дату. Ваш код не выполняется так. – Praveenkumar

Смежные вопросы