我使用Cocoa Touch進行了一次快速測試,以瞭解NSHebrewCalendar的工作原理。我對月份數字特別感興趣。我使用日期選擇器輕鬆更改日期,並將其傳遞給記錄希伯來語日期,希伯來語月數,希伯來語年以及年度是閏年的方法。看起來像這樣:我是否正確理解NSHebrewCalendar?
BOOL isHebrewLeapYear = [self.calendar isHebrewLeapYear:[calendar hebrewYearForDate:[self.calendar workingDate]]];
NSLog(@"Hebrew Date:%@, Month Number: %i, %i is Leap Year: %i", [self.calendar stringFromHebrewDate:[self.calendar workingDate]], [self.calendar hebrewMonthNumberFromDate:[self.calendar workingDate]], [calendar hebrewYearForDate:[self.calendar workingDate]], isHebrewLeapYear);
self.calendar
object是一個自定義類。 workingDate
屬性是一個NSDate
實例。這裏是相關的方法聲明。
- 月編號起始於1,與月被「提市黎月」:
// Check if a given year is a leap year - (BOOL) isHebrewLeapYear:(NSInteger)year{ return ((7 * year + 1) % 19) < 7; } //Get the hebrew year for a given date - (NSInteger) hebrewYearForDate:(NSDate *)date{ NSCalendar *hebrewCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSHebrewCalendar] autorelease]; return [[hebrewCalendar components:NSYearCalendarUnit fromDate:date] year]; } - (NSInteger) hebrewMonthNumberFromDate:(NSDate *)date{ NSCalendar *hebrewCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSHebrewCalendar] autorelease]; return [[hebrewCalendar components:NSMonthCalendarUnit fromDate:date] month]; }
顯然希伯來語閏年如下的處理。
- 在nonleap年,亞達是月7號,而不是6
- 在閏年,亞達我是6號和亞達II是7
- 「尼散月」始終是8,以此類推,直到「 Elul「,它總是13.
這聽起來像我的實驗產生準確的結果嗎?這種行爲是否在任何地方記錄?
感謝您的詳細解答!我不知道你對「isHebrewLeapYear」的簡化是正確的,因爲在19年的週期中有幾個閏年。 (這可能是因爲你正在與現代以色列日曆一起工作,而且我正在與傳統/聖經的日曆一起工作;我不知道足以告訴你這一點。) – Moshe
@Moshe哎呀,你是對的!我忘記每個週期有7個閏年;我在想只有一個。 –
我意識到這個職位是幾歲。但是,我想指出一些事情。在閏年,它是第一個Adar是閏月,Adar I.第二個月是Adar。現在我想弄清楚的是,當你有什麼是日期組件時,生成Adar II的最有效方法是什麼。如果你只是使用月份來索引月份數組,你會得到Adar,而不是Adar II。也許它會使用日期格式化程序,就像上面那樣,但是你需要一個日期而不是日期組件。 –