Исторические даты
Существует много проблем, которые могут возникнуть при контакте с датами в прошлом, не существующими для современных дат. Они включают даты, не существующие, предыдущие эры, куда поток времени перемещается от более высоких чисел года для понижения (таких как даты 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.