Привет,Проблема NSCalendar с эпохой BC.
Недавно я столкнулся с большой проблемой (как мне кажется) с классом NSCalendar.
В моей задаче мне нужно работать с большими периодами времени, начиная с 4000BC до 2000AD (по григорианскому календарю). В некотором месте я был вынужден увеличить NSDate на 100-летний интервал. При возрастании лет в шкале AD (0 -> ...) все работало нормально, но когда я пробовал то же самое с BC, я был немного смущен.
Проблема в том, что когда вы пытаетесь добавить 100 лет в 3000BC [отредактированный] год, вы получаете 3100BC [отредактировано] независимо от того ... Лично я нашел это странным и нелогичным. Правильный результат должен быть 2900BC.
Вот пример кода для вас, чтобы увидеть это «не правильное» поведение:
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.
BTW: метод [компоненты NSCalendar: fromDate: toDate: options:] не позволяет рассчитать разницу между годами эры BC ... дополнительная «ПОЧЕМУ?» в этом ящике Пандоры.
P.S .: Я копал официальную документацию и другие ресурсы, но ничего не нашел по этой проблеме (или, может быть, она предназначена для работы, и я идиот?).
3000AD + 100AD = 3100AD. Это основная арифметика. Из вашего описания математика верна. Я думаю, что внутри вашего кода вы хотите добавить от -1000 до -100, чтобы получить 1100BC, но поскольку вы не показали нам выход из вашего кода, мы не знаем, как это плохо. –
«... когда вы пытаетесь добавить 100 лет к 3000AD году, вы получите 3100AD независимо от того, что ... Лично я нашел это странным и нелогичным. Правильный результат должен быть 2900BC «Вы имели в виду сказать« BC »во всем этом пункте? В противном случае это не имеет смысла: AD 3000 + 100 = AD 3100; это правильный результат. –
Джонатан: Извините, я ошибся, это не AD, это BC. – GregoryM