Привет,
Недавно столкнулся с большой проблемой (как мне кажется) с классом NSCalendar.
В моей задаче мне нужно работать с большими временными периодами, начиная с 4000 г. до н.э. до 2000 г. н.э. (григорианский календарь). Кое-где меня заставили увеличить какой-то NSDate на 100-летний интервал. При увеличении лет на временной шкале AD (0 -> ...) все работало нормально, но когда я попробовал то же самое с BC, я был немного сбит с толку.
Проблема в том, что когда вы пытаетесь добавить 100 лет к 3000 г. до н.э. [отредактировано], вы получите 3100 г. до н.э. [отредактировано], несмотря ни на что ... Лично мне это показалось странным и нелогичным. Правильный результат должен быть 2900 г. до н.э.
Вот пример кода, чтобы вы могли увидеть это «неправильное» поведение:
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
// initing
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setYear:-1000];
NSDate *date = [gregorian dateFromComponents:comps];
// math
NSDateComponents *deltaComps = [[[NSDateComponents alloc] init] autorelease];
[deltaComps setYear:100];
date = [gregorian dateByAddingComponents:deltaComps toDate:date options:0];
// output
NSString *dateFormat = @"yyyy GG";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:dateFormat];
NSLog(@"%@", [formatter stringFromDate:date]);
Что вы можете сказать об этом поведении? Это так должно работать или это ошибка? Я в замешательстве: S.
Кстати: метод [NSCalendar components: fromDate: toDate: options:] не позволяет нам вычислить разницу между годами в эпоху до нашей эры ... дополнительное «ПОЧЕМУ?» в этом ящике Пандоры.
P.S .: Я копался в официальной документации и других ресурсах, но ничего не нашел относительно этой проблемы (или, может быть, это должно работать так, а я идиот?).