Исторические даты

Существует много проблем, которые могут возникнуть при контакте с датами в прошлом, не существующими для современных дат. Они включают даты, не существующие, предыдущие эры, куда поток времени перемещается от более высоких чисел года для понижения (таких как даты BC в Григорианском календаре), и календарные переходы (такие как переход от юлианского календаря до Григорианского календаря).

Григорианский календарь не имеет никакого года 0

В Юлианских и Григорианских календарях, представленных NSGregorianCalendar, нет никакого года 0. Это означает, что день после 31 декабря, 1 BC 1 января, 1 AD. Все предоставленные методы для calendrical вычислений принимают это во внимание, но Вы, возможно, должны составить его при создании дат из компонентов. Если Вы действительно пытаетесь создать дату с годом 0, это - вместо этого 1 BC. Кроме того, при создании даты из компонентов с помощью отрицательного значения года это создается с помощью астрономического года, нумеруя, в котором 0 соответствует 1 BC,-1 соответствует 2 BC, и т.д. Например, эти две даты, создаваемые в Перечислении 17equivalently, представляют 7 мая, 8 BC.

Перечисление 17  Используя отрицательные годы для представления дат BC

NSCalendar *gregorian=[[NSCalendar alloc]
     initWithCalendarIdentifier:NSGregorianCalendar];
 
NSDateComponents *bcDateComp=[[NSDateComponents alloc] init];
[bcDate setMonth: 5];
[bcDate setDay: 7];
[bcDate setYear: 8];
[bcDate setEra: 0];
 
NSDateComponents *astronDateComp=[[NSDateComponents alloc] init];
[bcDate setMonth: 5];
[bcDate setDay: 7];
[bcDate setYear: -7];
 
NSDate *bcDate=[gregorian dateFromComponents:bcDateComp];
NSDate *astronDate=[gregorian dateFromComponents:astronDateComp];

Юлианское к грегорианскому переходу

NSCalendar моделирует переход от Юлианского до Григорианского календаря в октябре 1582. Во время этого перехода были пропущены 10 дней. Это означает, что 15 октября 1582 следует 4 октября 1582. Все предоставленные методы для calendrical вычислений принимают это во внимание, но Вы, возможно, должны составить его при создании дат из компонентов. На 10 дней продвинуты даты, создаваемые в разрыве. Например, 8 октября 1582 сохранен как 18 октября 1582.

В различные более поздние времена некоторые страны приняли Григорианский календарь. Тем не менее, для непротиворечивости изменение моделируется одновременно независимо от локали. При необходимости в абсолютной исторической точности для определенной локали можно вычесть надлежащее число дней с даты, данной Григорианским календарем. Число дней для вычитания соответствует числу дополнительных дней прыжка в юлианском календаре. Если тот год не является кратным числом 400, таким образом в течение каждого 100-го года, юлианский календарь отстает от дня. Если необходимо создать дату Джулиана, необходимо вычесть корректное число дней с Грегорианской даты (10 в 1500-х и 1600-х, 11 в 1700-х, 12 в 1800-х, 13 в 1900-х и 2000-х, и т.д.). Необходимо также принять во внимание существование дней прыжка, которые не находятся в Григорианском календаре.

Работа с эрами с обратным потоком времени

В Григорианском календаре время разделено на две эры, эру BC и эру AD. В эру BC время течет в направлении по-видимому назад, которое является от более высоких чисел года для понижения. Однако дни и месяцы текут в нормальном направлении. Например, 1 февраля следует 31 января. Это может сбить с толку, если Вы спрашиваете, за чем день следует 31 декабря, 7 BC. Корректный ответ 1 января, 6 BC. Этот пример проиллюстрирован в Перечислении 18.

Перечисление 18  Завтра в эру BC

NSCalendar *gregorian=[[NSCalendar alloc]
     initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *dateBCComps=[[NSDateComponents alloc] init];
[dateBCComps setEra:0]; //Era 0 corresponds to BC
[dateBCComps setMonth:12];
[dateBCComps setDay:31];
[dateBCComps setYear:7];
 
NSDate *dateBC=[gregorian dateFromComponents:dateBCComps];
NSDateComponents *offsetDate=[[NSDateComponents alloc] init];
[offsetDate setDay:1];
NSDate *dateBC2=[gregorian dateByAddingComponents: offsetDate toDate:dateBC
     options:0];

После того, как этот код выполняется dateBC2 соответствует 1 января, 6 BC.