2015-09-30 5 views
1

Я делаю календарь для практических целей, и я пытаюсь найти количество дней в конкретном месяце того или иного года.Код возвращает неправильное количество дней в календаре

Мне удавалось найти правильные значения до сегодняшнего дня, когда внезапно я не получаю правильное количество дней только за февраль. Раньше он работал нормально, и я не внес никаких изменений в свой код.

Мой код:

-(NSDate *)startOfMonth:(NSInteger)calendarMonth :(NSInteger)calendarYear 
{ 
    NSDate *date=[NSDate date]; 
    NSCalendar * calendar = [NSCalendar currentCalendar]; 

    NSDateComponents * comps = [calendar components: NSCalendarUnitYear | NSCalendarUnitMonth |NSCalendarUnitDay fromDate:date]; 

    [comps setMonth:calendarMonth]; 

    [comps setYear:calendarYear]; 

    NSDate * monthOnlyDate = [calendar dateFromComponents:comps]; 

    NSDateComponents * currentDateComponents = [calendar components:  NSCalendarUnitYear | NSCalendarUnitMonth fromDate:monthOnlyDate ]; 

    self.numberOfDays = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:monthOnlyDate].length ; 

    NSLog(@"NUMBER OF DAYS==%li",(long)self.numberOfDays); 

    NSDate * startOfAnyMonth = [calendar dateFromComponents: currentDateComponents]; 
    NSDateFormatter *weekDay = [[NSDateFormatter alloc] init]; 
    [weekDay setDateFormat:@"EEE"]; 
    NSString * currentDay =[NSString stringWithFormat:@"%@",[weekDay stringFromDate:startOfAnyMonth]]; 
    [self updateFirstDateOFCurrentMonth:currentDay]; 
    return startOfAnyMonth; 
} 

ответ

0

Я предполагаю, что причина, она работает несколько дней назад и не работает сегодня на февраль, что февраль не имеет 30-й день (который сегодня), и вы создаете объект даты на основе текущего дня, а затем меняете месяц, не проверяя день.

Но более того, ваша логика для меня не совсем понятна. Если вы собираетесь получить первый день указанного месяца, почему бы просто не создать объект NSDate на основе компонентов, указанных в пользователь, предоставляя 1 в качестве значения для компонента дня? То, что вы делаете здесь, - это создание даты на основе сегодняшнего дня, изменение компонентов, а затем проверка их на получение значений, которые вы устанавливаете вручную (и, следовательно, уже знаете).

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

- (NSDate *)startOfMonth:(NSInteger)calendarMonth ofYear:(NSInteger)calendarYear 

Надеюсь, это поможет. Удачи.

+0

Отлично, он сработал. Спасибо большое. И я начну использовать объявление метода с именем параметра. –

+0

Я пытаюсь получить день за первый месяц, пройдя месяц и год. –

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