#objective-c #xcode #ios #label #nsdatecomponents
#objective-c #xcode #iOS #метка #nsdatecomponents
Вопрос:
У меня есть этот код:
- (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:
Это из-за перехода на летнее время. Мы добавляем 86400 секунд для каждого дня в этом цикле, но в один день будет 25 часов.
Редактировать:
Вероятно, лучший подход — это просто включить объект date в цикл и вообще не выполнять сложных вычислений.
- (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];
}