4

私はCocoaTouchで簡単なテストを行い、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は6か月ではなく7か月です。
  • うるう年では、Adar Iは6番、AdarIIは7番です。
  • 「ニサン」は常に8であり、「エルル」は常に13です。

私の実験は正確な結果を生み出しているように聞こえますか?この動作はどこかに文書化されていますか?

4

2 に答える 2

3

月の番号は 1 から始まり、その月は "Tishri" です。

正しい。

うるう年でない場合、Adar の月番号は 6 ではなく 7 です。

技術的に正しくありません。(これについては以下で詳しく説明します)

うるう年では、Adar I は 6 番、Adar II は 7 番です。

正しい。

「Nisan」は常に 8 で、「Elul」は常に 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)

ここでは、67 の月が両方ともAdar に評価されることがわかります。したがって、Adar は非うるう年の 6 番目と 7 番目の月の両方です。


また、5790 年は閏年であることがわかっているため、-isHebrewLeapYear:メソッドのより単純な実装を推測できます。

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

于 2011-11-20T02:40:34.933 に答える
1

閏年がいつであるかについて独自の計算を行うことを避けるために、これをテストするために使用したコードを次に示します (通常の年の6 月と7 月が Adar I であるという以前の調査結果に基づいています。

- (BOOL)isRegularYear:(NSDate *)date {
    NSCalendar *hebrew = [[NSCalendar alloc] initWithCalendarIdentifier:NSHebrewCalendar];

    NSDateComponents *comp = [hebrew components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];

    [comp setMonth:6];
    NSDate *adar_i = [hebrew dateFromComponents:comp];
    [comp setMonth:7];
    NSDate *adar_ii = [hebrew dateFromComponents:comp];

    return [adar_i isEqualToDate:adar_ii];
}
于 2014-01-02T02:28:53.743 に答える