3

Mac OS X では、[システム設定] > [日付と時刻] > [言語とテキストを開く] > [上部] の [形式] をクリックして、カレンダーのドロップ ダウンで、コプティック カレンダーのオプションを選択します。このカレンダーを Mac アプリケーションで表示するにはどうすればよいですか?

4

1 に答える 1

9

このカレンダーを Mac アプリケーションで表示するにはどうすればよいですか?

さて、ディスプレイとはどういう意味ですか? 計算にコプト暦を使用したいだけですか? その場合、必要なのは適切なNSCalendarインスタンスだけです。(および友人)はICUによってサポートされているため、ICUがサポートする任意の識別子をNSCalendar使用できます(「キー/タイプ定義」の下)。つまり、次の中から選択できます。

  • gregorian- (デフォルト)
  • islamic- 天文アラビア語
  • chinese- 繁体字のカレンダー
  • islamic-civil- 市民 (アルゴリズム) アラビア暦
  • hebrew- 伝統的なヘブライ暦
  • japanese- 帝国暦 (西暦以外はグレゴリオ暦と同じで、皇帝ごとに元号が 1 つずつあります)
  • buddhist・タイ仏暦(西暦以外はグレゴリオ暦と同じ)
  • persian- ペルシャのカレンダー
  • coptic- コプト暦
  • ethiopic- エチオピア暦

したがって、NSCalendarインスタンスを取得するには、次の問題になります。

NSCalendar *coptic = [[NSCalendar alloc] initWithCalendarIdentifier:@"coptic"];

ただし、実際に何らかの UI (iCal 風) を描画したい場合は、さらに多くの情報が必要です。幸いなことに、 からも取得できますNSCalendar

たとえば、カレンダーの月数を知る必要があります。

NSRange minMonthRange = [coptic minimumRangeOfUnit:NSMonthCalendarUnit]; // {1,13}
NSRange maxMonthRange = [coptic maximumRangeOfUnit:NSMonthCalendarUnit]; // {1,13}

したがって、毎年 13 か月あるように見えます。では、1 か月の日数はどうでしょうか。

NSRange minDayRange = [coptic minimumRangeOfUnit:NSDayCalendarUnit]; // {1,5}
NSRange maxDayRange = [coptic maximumRangeOfUnit:NSDayCalendarUnit]; // {1,30}

うわあ!5日しかない月もありそうですね!(ただし、1 か月が 30 日を超えることはありません) もう少し調べられるかどうか見てみましょう。

NSDateComponents *firstDayOfMonth = [[NSDateComponents alloc] init];
[firstDayOfMonth setDay:1];
for (NSInteger y = 1500; y < 1520; ++y) {
    [firstDayOfMonth setYear:y];
    for (NSInteger m = 1; m <= 13; ++m) {
        [firstDayOfMonth setMonth:m];

        NSDate *date = [coptic dateFromComponents:firstDayOfMonth];

        NSRange rangeOfDaysInMonth = [coptic rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
        NSLog(@"%d - %d => %@", y, m, NSStringFromRange(rangeOfDaysInMonth));
    }
}

これは 20 年間繰り返さNSDateれ、各年の各月の最初の日に対応する を構築します。次に、その月の日数を確認し、結果をログに記録します。1500(と1520は私が選んだ任意の年であることに注意してください)

これはログに記録します:

1500 - 1 => {1, 30}
1500 - 2 => {1, 30}
1500 - 3 => {1, 30}
1500 - 4 => {1, 30}
1500 - 5 => {1, 30}
1500 - 6 => {1, 30}
1500 - 7 => {1, 30}
1500 - 8 => {1, 30}
1500 - 9 => {1, 30}
1500 - 10 => {1, 30}
1500 - 11 => {1, 30}
1500 - 12 => {1, 30}
1500 - 13 => {1, 5}
1501 - 1 => {1, 30}
1501 - 2 => {1, 30}
1501 - 3 => {1, 30}
1501 - 4 => {1, 30}
1501 - 5 => {1, 30}
1501 - 6 => {1, 30}
1501 - 7 => {1, 30}
1501 - 8 => {1, 30}
1501 - 9 => {1, 30}
1501 - 10 => {1, 30}
1501 - 11 => {1, 30}
1501 - 12 => {1, 30}
1501 - 13 => {1, 5}
1502 - 1 => {1, 30}
1502 - 2 => {1, 30}
1502 - 3 => {1, 30}
1502 - 4 => {1, 30}
1502 - 5 => {1, 30}
1502 - 6 => {1, 30}
1502 - 7 => {1, 30}
1502 - 8 => {1, 30}
1502 - 9 => {1, 30}
1502 - 10 => {1, 30}
1502 - 11 => {1, 30}
1502 - 12 => {1, 30}
1502 - 13 => {1, 5}
1503 - 1 => {1, 30}
1503 - 2 => {1, 30}
1503 - 3 => {1, 30}
1503 - 4 => {1, 30}
1503 - 5 => {1, 30}
1503 - 6 => {1, 30}
1503 - 7 => {1, 30}
1503 - 8 => {1, 30}
1503 - 9 => {1, 30}
1503 - 10 => {1, 30}
1503 - 11 => {1, 30}
1503 - 12 => {1, 30}
1503 - 13 => {1, 6}
1504 - 1 => {1, 30}
1504 - 2 => {1, 30}
1504 - 3 => {1, 30}
1504 - 4 => {1, 30}
1504 - 5 => {1, 30}
1504 - 6 => {1, 30}
1504 - 7 => {1, 30}
1504 - 8 => {1, 30}
1504 - 9 => {1, 30}
1504 - 10 => {1, 30}
1504 - 11 => {1, 30}
1504 - 12 => {1, 30}
1504 - 13 => {1, 5}
1505 - 1 => {1, 30}
1505 - 2 => {1, 30}
1505 - 3 => {1, 30}
1505 - 4 => {1, 30}
1505 - 5 => {1, 30}
1505 - 6 => {1, 30}
1505 - 7 => {1, 30}
1505 - 8 => {1, 30}
1505 - 9 => {1, 30}
1505 - 10 => {1, 30}
1505 - 11 => {1, 30}
1505 - 12 => {1, 30}
1505 - 13 => {1, 5}
1506 - 1 => {1, 30}
1506 - 2 => {1, 30}
1506 - 3 => {1, 30}
1506 - 4 => {1, 30}
1506 - 5 => {1, 30}
1506 - 6 => {1, 30}
1506 - 7 => {1, 30}
1506 - 8 => {1, 30}
1506 - 9 => {1, 30}
1506 - 10 => {1, 30}
1506 - 11 => {1, 30}
1506 - 12 => {1, 30}
1506 - 13 => {1, 5}
1507 - 1 => {1, 30}
1507 - 2 => {1, 30}
1507 - 3 => {1, 30}
1507 - 4 => {1, 30}
1507 - 5 => {1, 30}
1507 - 6 => {1, 30}
1507 - 7 => {1, 30}
1507 - 8 => {1, 30}
1507 - 9 => {1, 30}
1507 - 10 => {1, 30}
1507 - 11 => {1, 30}
1507 - 12 => {1, 30}
1507 - 13 => {1, 6}
1508 - 1 => {1, 30}
1508 - 2 => {1, 30}
1508 - 3 => {1, 30}
1508 - 4 => {1, 30}
1508 - 5 => {1, 30}
1508 - 6 => {1, 30}
1508 - 7 => {1, 30}
1508 - 8 => {1, 30}
1508 - 9 => {1, 30}
1508 - 10 => {1, 30}
1508 - 11 => {1, 30}
1508 - 12 => {1, 30}
1508 - 13 => {1, 5}
1509 - 1 => {1, 30}
1509 - 2 => {1, 30}
1509 - 3 => {1, 30}
1509 - 4 => {1, 30}
1509 - 5 => {1, 30}
1509 - 6 => {1, 30}
1509 - 7 => {1, 30}
1509 - 8 => {1, 30}
1509 - 9 => {1, 30}
1509 - 10 => {1, 30}
1509 - 11 => {1, 30}
1509 - 12 => {1, 30}
1509 - 13 => {1, 5}
1510 - 1 => {1, 30}
1510 - 2 => {1, 30}
1510 - 3 => {1, 30}
1510 - 4 => {1, 30}
1510 - 5 => {1, 30}
1510 - 6 => {1, 30}
1510 - 7 => {1, 30}
1510 - 8 => {1, 30}
1510 - 9 => {1, 30}
1510 - 10 => {1, 30}
1510 - 11 => {1, 30}
1510 - 12 => {1, 30}
1510 - 13 => {1, 5}
1511 - 1 => {1, 30}
1511 - 2 => {1, 30}
1511 - 3 => {1, 30}
1511 - 4 => {1, 30}
1511 - 5 => {1, 30}
1511 - 6 => {1, 30}
1511 - 7 => {1, 30}
1511 - 8 => {1, 30}
1511 - 9 => {1, 30}
1511 - 10 => {1, 30}
1511 - 11 => {1, 30}
1511 - 12 => {1, 30}
1511 - 13 => {1, 6}
1512 - 1 => {1, 30}
1512 - 2 => {1, 30}
1512 - 3 => {1, 30}
1512 - 4 => {1, 30}
1512 - 5 => {1, 30}
1512 - 6 => {1, 30}
1512 - 7 => {1, 30}
1512 - 8 => {1, 30}
1512 - 9 => {1, 30}
1512 - 10 => {1, 30}
1512 - 11 => {1, 30}
1512 - 12 => {1, 30}
1512 - 13 => {1, 5}
1513 - 1 => {1, 30}
1513 - 2 => {1, 30}
1513 - 3 => {1, 30}
1513 - 4 => {1, 30}
1513 - 5 => {1, 30}
1513 - 6 => {1, 30}
1513 - 7 => {1, 30}
1513 - 8 => {1, 30}
1513 - 9 => {1, 30}
1513 - 10 => {1, 30}
1513 - 11 => {1, 30}
1513 - 12 => {1, 30}
1513 - 13 => {1, 5}
1514 - 1 => {1, 30}
1514 - 2 => {1, 30}
1514 - 3 => {1, 30}
1514 - 4 => {1, 30}
1514 - 5 => {1, 30}
1514 - 6 => {1, 30}
1514 - 7 => {1, 30}
1514 - 8 => {1, 30}
1514 - 9 => {1, 30}
1514 - 10 => {1, 30}
1514 - 11 => {1, 30}
1514 - 12 => {1, 30}
1514 - 13 => {1, 5}
1515 - 1 => {1, 30}
1515 - 2 => {1, 30}
1515 - 3 => {1, 30}
1515 - 4 => {1, 30}
1515 - 5 => {1, 30}
1515 - 6 => {1, 30}
1515 - 7 => {1, 30}
1515 - 8 => {1, 30}
1515 - 9 => {1, 30}
1515 - 10 => {1, 30}
1515 - 11 => {1, 30}
1515 - 12 => {1, 30}
1515 - 13 => {1, 6}
1516 - 1 => {1, 30}
1516 - 2 => {1, 30}
1516 - 3 => {1, 30}
1516 - 4 => {1, 30}
1516 - 5 => {1, 30}
1516 - 6 => {1, 30}
1516 - 7 => {1, 30}
1516 - 8 => {1, 30}
1516 - 9 => {1, 30}
1516 - 10 => {1, 30}
1516 - 11 => {1, 30}
1516 - 12 => {1, 30}
1516 - 13 => {1, 5}
1517 - 1 => {1, 30}
1517 - 2 => {1, 30}
1517 - 3 => {1, 30}
1517 - 4 => {1, 30}
1517 - 5 => {1, 30}
1517 - 6 => {1, 30}
1517 - 7 => {1, 30}
1517 - 8 => {1, 30}
1517 - 9 => {1, 30}
1517 - 10 => {1, 30}
1517 - 11 => {1, 30}
1517 - 12 => {1, 30}
1517 - 13 => {1, 5}
1518 - 1 => {1, 30}
1518 - 2 => {1, 30}
1518 - 3 => {1, 30}
1518 - 4 => {1, 30}
1518 - 5 => {1, 30}
1518 - 6 => {1, 30}
1518 - 7 => {1, 30}
1518 - 8 => {1, 30}
1518 - 9 => {1, 30}
1518 - 10 => {1, 30}
1518 - 11 => {1, 30}
1518 - 12 => {1, 30}
1518 - 13 => {1, 5}
1519 - 1 => {1, 30}
1519 - 2 => {1, 30}
1519 - 3 => {1, 30}
1519 - 4 => {1, 30}
1519 - 5 => {1, 30}
1519 - 6 => {1, 30}
1519 - 7 => {1, 30}
1519 - 8 => {1, 30}
1519 - 9 => {1, 30}
1519 - 10 => {1, 30}
1519 - 11 => {1, 30}
1519 - 12 => {1, 30}
1519 - 13 => {1, 6}

これを分析すると、(通常) 5 日である 13 番目の月を除いて、各月は 30 日であることがわかります。4年に一度、13番目の月は6日あるようです。それがうるう日を処理する方法に違いありません。これは確かに良いカレンダーです!すべてが素晴らしく、規則的です。

もう少し調べてみましょう。

NSRange minHourRange = [coptic minimumRangeOfUnit:NSHourCalendarUnit]; // {0,24}
NSRange maxHourRange = [coptic maximumRangeOfUnit:NSHourCalendarUnit]; // {0,24}

したがって、毎日は 24 時間です (サマータイムのジャンプは、この範囲には反映されません。グレゴリオ暦では、DST の移行に応じて、23 時間または 25 時間になる日もありますが、最小時間範囲{0,24}および最大時間範囲も報告されます。 {0,24})。

分と秒のレベル (それぞれ 60) も正常です。

そのため、自分でカレンダーを表示したい場合は、1 年に 13 か月を処理できる UI が必要になります。そのうちの 1 か月は 1 週間未満です。サブデイレベルでは、物事は私たちが慣れているものです.


もちろん、コプト暦に関するウィキペディアの記事を読むこともできます。


編集(コメントに基づく)

日付を文字列としてフォーマットすることだけが必要な場合は、(もちろん)次のようになりNSDateFormatterます。

NSDateFormatter *f = [[NSDateFormatter alloc] init];
NSCalendar *coptic = [[NSCalendar alloc] initWithCalendarIdentifier:@"coptic"];
[f setCalendar:coptic];
[f setDateStyle:NSDateFormatterLongStyle];

NSDate *rightNow = [NSDate date];
NSString *formattedDate = [f stringFromDate:rightNow];
NSLog(@"%@", formattedDate); // logs "Bashans 4, 1728"
于 2012-05-12T15:38:58.387 に答える