Я считаю, что NSDate / NSCalendar имеет одну или две ошибки на iOS 4.2.
[[NSDate date] description]
всегда печатает с использованием GMT, т.е. настройка местного часового пояса игнорируется.Ранее сообщалось, но мы надеемся, что лучше объясним вывод ниже.
[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateA]
Не всегда возвращает правильное значение, а это:
[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateA]
На основеВ предыдущем посте я создал тестовый код:
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate* dateA = [formatter dateFromString:@"2010-12-29 11:11:17 +1100"];
NSDate* dateB = [formatter dateFromString:@"2010-12-29 10:11:17 +1100"];
NSDate* dateC = [formatter dateFromString:@"2010-12-27 11:11:17 +1100"];
NSDate* dateD = [formatter dateFromString:@"2010-12-27 10:11:17 +1100"];
NSLog(@"dateA=%@, %@", dateA, [formatter stringFromDate:dateA]);
NSLog(@"dateB=%@, %@", dateB, [formatter stringFromDate:dateB]);
NSLog(@"dateC=%@, %@", dateC, [formatter stringFromDate:dateC]);
NSLog(@"dateD=%@, %@", dateD, [formatter stringFromDate:dateD]);
NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSLog(@"timezone=%@", [calendar timeZone]);
NSLog(@"A day inUnit:Year=%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateA]);
NSLog(@"B day inUnit:Year=%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateB]);
NSLog(@"C day inUnit:Year=%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateC]);
NSLog(@"D day inUnit:Year=%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateD]);
NSLog(@"A day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateA]);
NSLog(@"B day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateB]);
NSLog(@"C day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateC]);
NSLog(@"D day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateD]);
и получил вывод:
[33920:207] dateA=2010-12-29 00:11:17 +0000, 2010-12-29 11:11:17 +1100
[33920:207] dateB=2010-12-28 23:11:17 +0000, 2010-12-29 10:11:17 +1100
[33920:207] dateC=2010-12-27 00:11:17 +0000, 2010-12-27 11:11:17 +1100
[33920:207] dateD=2010-12-26 23:11:17 +0000, 2010-12-27 10:11:17 +1100
[33920:207] timezone=Australia/Hobart (GMT+11:00) offset 39600 (Daylight)
[33920:207] A day inUnit:Year=363
[33920:207] B day inUnit:Year=363
[33920:207] C day inUnit:Year=361
[33920:207] D day inUnit:Year=361
[33920:207] A day inUnit:Era =734135
[33920:207] B day inUnit:Era =734134
[33920:207] C day inUnit:Era =734133
[33920:207] D day inUnit:Era =734132