IOS: проблема с NSDateComponent - PullRequest
       5

IOS: проблема с NSDateComponent

1 голос
/ 20 апреля 2011

У меня есть этот код:

- (void) setDataLabel{

for (int k = 0; k<31; k++){

    [[lineSunday objectAtIndex:k] setAlpha:0.00];
    [[arrayDay objectAtIndex:k] setTextColor:[UIColor whiteColor]];
}

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setYear:2011];
[components setDay:1];
[components setMonth:10];
//NSLog(@"mese:%d", month);
NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDate *firstDate = [gregorianCalendar dateFromComponents:components];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd"];

for (int i = 0; i < 31; i++) {
    NSTimeInterval seconds = 24*60*60 * i;
    NSDate *date = [NSDate dateWithTimeInterval:seconds sinceDate:firstDate];
    NSDateComponents *weekdayComponents = [gregorianCalendar components:NSWeekdayCalendarUnit fromDate:date];
    int weekday = [weekdayComponents weekday];
    NSString *strDate = [dateFormatter stringFromDate: date];
    [[arrayDay objectAtIndex:i] setText:strDate];
    if (weekday == 1) {
        [[arrayDay objectAtIndex:i] setTextColor:[UIColor redColor]];
        [[lineSunday objectAtIndex:i] setAlpha:1.00];
    }
}

Этот код устанавливает 31 метку с днями месяца, и все в порядке, но я не понимаю, почему в октябре месяце всегда бывает два дня подряд;пример: в этом году этот код пишите в конце месяца день таким образом:

.... 25 26 27 28 29 30 30

, а 30 и 30 - красныецвет, но это не должно быть так, оно должно быть

.... 25 26 27 28 29 30 31

и только 30 должны быть красного цвета

Почему этослучиться?

1 Ответ

1 голос
/ 20 апреля 2011

Это из-за перехода на летнее время.Мы добавляем 86400 секунд для каждого дня в этом цикле, но один день будет иметь 25 часов.

Редактировать:

Лучшим подходом, вероятно, является просто получение объекта даты в циклевообще не делаю причудливых расчетов.

- (void) setDataLabel{

    for (int k = 0; k<31; k++){
        [[lineSunday objectAtIndex:k] setAlpha:0.00];
        [[arrayDay objectAtIndex:k] setTextColor:[UIColor whiteColor]];
    }

    NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
    [components setYear:2011];
    [components setMonth:10];
    NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd"];

    for (int i = 0; i < 31; i++) {
        [components setDay:i+1];
        NSDate *date = [gregorianCalendar dateFromComponents:components];
        NSDateComponents *weekdayComponents = [gregorianCalendar components:NSWeekdayCalendarUnit fromDate:date];
        int weekday = [weekdayComponents weekday];
        NSString *strDate = [dateFormatter stringFromDate: date];
        [[arrayDay objectAtIndex:i] setText:strDate];
        if (weekday == 1) {
            [[arrayDay objectAtIndex:i] setTextColor:[UIColor redColor]];
            [[lineSunday objectAtIndex:i] setAlpha:1.00];
        }
    }
    [dateFormatter release];
    [gregorianCalendar release];
    [components release];
}
...