日付の操作をするときに、その年が閏年であるかを判定することがあります
この場合は、下記のようなコードを使用します
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言語で表現すると冒頭のコードになります
コメント