我使用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。也许它会使用日期格式化程序,就像上面那样,但是你需要一个日期而不是日期组件。 –