0

重複の可能性:
うるう年を見つける方法は?

うるう年の正確な定義は何ですか?AFAIK「4で割り切れる年はうるう年です。しかし、1世紀の間、400で割り切れる年はうるう年です。

しかし、その定義により、100、200、300、400 ....最大1700年はうるう年ではありません!しかし、グレゴリオ暦では、それらはすべてうるう年です。これを確認してください

Linuxで「call1700」を試して確認することもできます。

したがって、うるう年の正しいアルゴリズムは次のようになります。

if ( (year % 4 == 0) && ( year <= 1700 || year % 100 != 0 || year % 400 == 0 ))
    printf("%d is a leap year.\n", year);
 else
    printf("%d is not a leap year.\n", year);

しかし、これはグレゴリオ暦に固有のものですか?そうだとしても、なぜここで言及されていないのですか?

よろしく、

PS:グレゴリオ暦の発信者の歴史は興味深いようです。 1752年の9月をチェックしてください。

4

6 に答える 6

2

一つには、あなたのアルゴリズムは少しずれています。それはもっと似ています:

if ( (year % 4 == 0) && ( year % 100 != 0 || year % 400 == 0 ))
    printf("%d is a leap year.\n", year);
 else
    printf("%d is not a leap year.\n", year);

また、グレゴリオ暦は1582年頃まで採用されませんでした。

編集:

グレゴリオ暦は1582年に布告されましたが、トルコでは1926年まで、さまざまな時期にさまざまな国で採用されました。

于 2010-06-12T17:01:45.870 に答える
2

過去の日付の概念と日付の計算を分離することが重要だと思います。歴史的な日付は、あらゆる種類の政治的、社会的、および技術的な問題の影響を受けるため、単純なアルゴリズムにはあまり適していません。現代のグレゴリオ暦の採用における大きな格差については、このページを参照してください。

日付を計算するときの通常の慣行は、履歴を忘れて、既存のシステムが常に実施されており、今後も実施されると偽ることです。(あなたが天文学者または他の特定の種類の科学者でない限り、その場合はさらに正確なものを使用し、過去の日付にはさらに関心がなくなります。)アプリケーションがすべて記録された過去の日付に関するものである場合は、次のようになります。とにかく、それらの日付(国、歴史の期間などに依存します)をより計算しやすいユニバーサルデートシステムにマッピングする方法が必要です。

于 2010-06-12T17:25:54.610 に答える
0

こちらをご覧ください。参考までに、ここにいくつかの擬似コードをコピーします。

if (year modulo 4 is 0) and ((year modulo 100 is not 0) or (year modulo 400 is 0))
       then is_leap_year
else
       not_leap_year
于 2010-06-12T17:01:14.247 に答える
0

「しかし、これはグレゴリオ暦に固有のものです」

はい。

こちらをお読みくださいhttp://en.wikipedia.org/wiki/Leap_year

地球(および月)の軌道のために、さまざまなカレンダーがあり、それぞれに、日と年の間で合理的な一致を得ようとするための複雑なルールがあります。

こちらをお読みくださいhttp://en.wikipedia.org/wiki/Gregorian_calendar

http://emr.cs.uiuc.edu/home/reingold/calendar-book/index.shtmlのコピーを購入してください

于 2010-06-12T17:08:13.407 に答える
0

リンクしたウェブページを読んでください。1752年9月のギャップの理由は、英国がグレゴリオ暦からグレゴリオ暦に変換したとき、それはグレゴリオ暦のギャップではなく、2つの違いであるためです。

リンク先のページは、その時点までのユリウス暦を使用しています。したがって、うるう年の計算に使用するアルゴリズムは、1752年より前の年のページ(または英国、または英国、ただしAD 100には存在しません)の計算方法とは異なります。

于 2010-06-12T17:16:46.100 に答える
0

プラットフォームにDateデータ型がある場合、最初の試みは、プラットフォームが持つ日付式と操作機能を使用することです。通常はこれらで十分であり、YA日付処理ライブラリをサポートする責任を負う手間を省くことができます。

したがって、あなたの質問に対する答えは次のようになります。

if(exists( "02/29 / yyyy" .toDate))..。

于 2010-06-12T18:52:43.060 に答える