gpt4 book ai didi

objective-c - 我是否正确理解 NSHebrewCalendar?

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:52 25 4
gpt4 key购买 nike

我用 Cocoa Touch 进​​行了一次快速测试,看看 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 对象是一个自定义类。 workingDate 属性是一个 NSDate 实例。下面是相关的方法声明。

//  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];
}

显然,希伯来闰年的处理方式如下:

  • 月份编号从 1 开始,该月份为“Tishri”。
  • 在非闰年,Adar 是第 7 个月,而不是第 6 个月。
  • 在闰年,Adar I 是 6 号,Adar II 是 7 号。
  • “Nisan”总是 8,依此类推,直到“Elul”总是 13。

听起来我的实验产生了准确的结果吗?这种行为是否记录在任何地方?

最佳答案

Month numbering starts at 1, with that month being "Tishri".

正确。

In a nonleap year, Adar is month number 7, not 6.

技术上不正确。 (更多内容见下文)

In a leap year, Adar I is number 6 and Adar II is 7.

正确。

"Nisan" is always 8 and so on until "Elul", which is always 13.

正确。

那么非闰年的 Adar 是怎么回事?我运行这段代码来找出答案:

@autoreleasepool {

NSDate *today = [NSDate date];
NSCalendar *hebrew = [[NSCalendar alloc] initWithCalendarIdentifier:NSHebrewCalendar];
NSDateComponents *diff = [[NSDateComponents alloc] init];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"d MMMM y"];
[f setCalendar:hebrew];

for (NSInteger i = 0; i < 19; ++i) {
NSDateComponents *comp = [[NSDateComponents alloc] init];
[comp setYear:5772 + i];
[comp setDay:1];

NSLog(@"============= %d ============", [comp year]);

for (NSInteger i = 1; i <= 13; ++i) {
[comp setMonth:i];

NSDate *d = [hebrew dateFromComponents:comp];
NSLog(@"%d: %@ (%@)", i, [f stringFromDate:d], d);
}
}

}

在闰年,这将记录您期望的内容:

============= 5790 ============
1: 1 Tishri 5790 (2029-09-10 07:00:00 +0000)
2: 1 Heshvan 5790 (2029-10-10 07:00:00 +0000)
3: 1 Kislev 5790 (2029-11-08 08:00:00 +0000)
4: 1 Tevet 5790 (2029-12-07 08:00:00 +0000)
5: 1 Shevat 5790 (2030-01-05 08:00:00 +0000)
6: 1 Adar I 5790 (2030-02-04 08:00:00 +0000)
7: 1 Adar II 5790 (2030-03-06 08:00:00 +0000)
8: 1 Nisan 5790 (2030-04-04 07:00:00 +0000)
9: 1 Iyar 5790 (2030-05-04 07:00:00 +0000)
10: 1 Sivan 5790 (2030-06-02 07:00:00 +0000)
11: 1 Tamuz 5790 (2030-07-02 07:00:00 +0000)
12: 1 Av 5790 (2030-07-31 07:00:00 +0000)
13: 1 Elul 5790 (2030-08-30 07:00:00 +0000)

对于“月”日期部分的每次递增,我们都会得到一个不同的日期。但是当我们在非闰年运行它时,我们得到这个:

============= 5789 ============
1: 1 Tishri 5789 (2028-09-21 07:00:00 +0000)
2: 1 Heshvan 5789 (2028-10-21 07:00:00 +0000)
3: 1 Kislev 5789 (2028-11-19 08:00:00 +0000)
4: 1 Tevet 5789 (2028-12-19 08:00:00 +0000)
5: 1 Shevat 5789 (2029-01-17 08:00:00 +0000)
6: 1 Adar 5789 (2029-02-16 08:00:00 +0000)
7: 1 Adar 5789 (2029-02-16 08:00:00 +0000)
8: 1 Nisan 5789 (2029-03-17 07:00:00 +0000)
9: 1 Iyar 5789 (2029-04-16 07:00:00 +0000)
10: 1 Sivan 5789 (2029-05-15 07:00:00 +0000)
11: 1 Tamuz 5789 (2029-06-14 07:00:00 +0000)
12: 1 Av 5789 (2029-07-13 07:00:00 +0000)
13: 1 Elul 5789 (2029-08-12 07:00:00 +0000)

在这里我们看到有一个月的 6 7 将两者评估为 Adar。因此,亚达月既是平年的第 6 个月又是第 7 个月。


此外,由于我们知道 5790 年是闰年,我们可以推导出一个更简单的 -isHebrewLeapYear: 实现。方法:

- (BOOL) isHebrewLeapYear:(NSInteger)year{
return year % 19 == 14;
}

<罢工>

关于objective-c - 我是否正确理解 NSHebrewCalendar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8198526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com