閏年について

日付の操作をするときに、その年が閏年であるかを判定することがあります

この場合は、下記のようなコードを使用します

int is_leap(int y){
return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
}

引数に年を渡すと、

平年の場合、0

閏年の場合、1

を返します

使い方はとても簡単です

ここからは、なぜ 上記の関数で閏年が判定できるかについて解説していきます

1年は、365日というのが一般的な理解です

しかしながら、地球は365.2422日で1周します

もし、毎年 365日でカウントすると(365日経つと次の年) 同じ日付(例えば 1月1日)での、地球の位置がズレていきます

カウント 同じ日付の地球の位置のズレ
2017 365日 -0.2422日
2018 365日 -0.4844日
2019 365日 -0.7266日
2020 365日 -0.9688日

このズレを修正するために 1年を366日でカウントする年が作られています

これが閏年です。

カウント 同じ日付の地球の位置のズレ
2017 365日 -0.2422日
2018 365日 -0.4844日
2019 365日 -0.7266日
2020 366日 0.0312日

ここまでは知っている人も多いと思います

閏年は、4年に1回というのが一般的な理解です

しかしながら、必ずしも4年に1回 閏年が来るわけではありません

もし、4年毎に閏年を作ると 同じ日付(例えば1月1日)での、地球の位置がズレていきます

平年/閏年 カウント 同じ日付での地球の位置のズレ(日)
1920 閏年 366日 0.0312
1924 閏年 366日 0.0624
2000 閏年 366日 0.6552
2016 閏年 366日 0.78
2020 閏年 366日 0.8112

このズレを修正するために 4年に1回であっても、100年に1回の場合は 1年を365日でカウントします

これが4年毎に閏年にならない年です

平年/閏年 カウント 同じ日付での地球の位置のズレ(日)
1920 閏年 366日 0.0312
1924 閏年 366日 0.0624
2000 閏年 365日 -0.376
2016 閏年 366日 -0.2512
2020 閏年 366日 -0.22

ここまでの、閏年のルールをまとめておきましょう

  • ルール1 : 4年毎に +1日
  • ルール2 : ルール1で、100で割り切れる年は、+1日を適用しない

これら2つのルールでも、まだ地球の位置のズレは残っていしまいます

400年に一度 1日分ズレます(足りなくなります)

そこで、400年に一度、+1日

これが閏年の最後のルールです

最後に閏年が適用されるルールをまとめます

  • ルール1 : 4年毎に +1日
  • ルール2 : ルール1で、100で割り切れる年は、+1日を適用しない
  • ルール3 : ルール2に関わらず、400で割り切れる年は、+1日

これら3つルールを、C言語で表現すると冒頭のコードになります

コメント

この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
タイトルとURLをコピーしました