閏年(うるう年)はいつ?仕組みと計算方法をまとめました!

記事更新日: 2021/03/03

ライター: ナガヤン

ハローエンジニア!SEライターのナガヤンです。

今年、2021年は「オリンピックイヤー」なんて言われていますが、2月28日の翌日には3月が始まりました。

 

「オリンピックイヤー」は4年ごとの夏季オリンピックの開催年になるため、開催年は閏年となります。

しかし、閏年が4年ごとかというと、実は違います。

 

それでは、閏年になるのは何年なのか?閏年とはいったい何なのか?

仕組みと計算による判定方法をまとめました!

閏年(うるう年)とは?

閏年(うるう年)は、ふだんより1日多い年

閏年(うるう年)は、通常の年(平年)より1日多くなる年を意味します。

平年の1年間(1月1日~12月31日)は365日あります。それが、閏年では1日増えて366日となります。

増えた1日分は、2月の最終日に追加されて「2月29日」となります。この日

閏年(うるう年)は、暦のずれを調整するためにある

そもそも、なぜ1日増やす必要があるのでしょうか?

私たちが使っているカレンダーは「グレゴリオ暦」という暦法を使っていて、平年を365日としています。対して、実際の太陽の観測から求められた「平均太陽年」は、365.242189572日と約1/4日長くなっています。

この約1/4日分のズレを調整するため、平年より1日多い閏年を設けて調整するということですね。

閏年(うるう年)の判定方法

閏年(うるう年)は4年に1回ではない!

閏年(うるう年)は4年に1回」と思っている方は、大人でも多いのではないでしょうか?

実際の閏年は4年に1回ではなく、次のように定められています。

グレゴリオ暦における閏年の決定方法
  • 西暦年が4で割り切れる年は(原則として)閏年。
  • ただし、西暦年が100で割り切れる年は(原則として)平年。
  • ただし、西暦年が400で割り切れる年は必ず閏年。

ちょっとややこしいですね。

まず1つ目のルール、「西暦年が4で割り切れる年は(原則として)閏年」

例えば、2020年は 2020 ÷ 4 = 505 で割り切れるため閏年になります。

2021年は 2021 ÷ 4 = 505 あまり 1 になるため平年となります。

2つ目のルールは「ただし、西暦年が100で割り切れる年は(原則として)平年」

例えば、2100年は 2100 ÷ 100 = 21 で割り切れるため平年になります。

2104年は 2104 ÷ 100 = 21 あまり 4 になるため閏年となります。

3つ目のルールは「ただし、西暦年が400で割り切れる年は必ず閏年」

例えば、2000年は 2000 ÷ 400 = 5 で割り切れるため閏年になります。

2100年は 2100 ÷ 400 = 5 あまり 100 になるため平年となります。

計算での判定方法:除数が大きいほうから考える

プログラミングなど、計算によって判定する場合は、閏年の決定方法を次のように読み替えます。

計算による閏年の判定ロジック
  • 西暦年が400で割り切れる年は閏年
  • それ以外で、西暦年が100で割り切れる年は平年
  • それ以外で、西暦年が4で割り切れる年は閏年
  • それ以外なら平年

実装例:Excel/スプレッドシート

まずオーソドックスに判定ロジックそのままに書いてみましょう。

複数の条件分岐を扱うIFS関数と、割り算のあまりを出すMOD関数を組み合わせて、次のような式で表せます。

=IFS(MOD(A1,400)=0,"閏年",MOD(A1,100)=0,"平年",MOD(A1,4)=0,"閏年",1,"平年")

これで、A1セルに西暦年を入力すると、閏年かどうかがわかります。

ただ、この式の場合は閏年かどうか「表示する」ことはできますが、条件文には使えません。

条件付き書式などを使う場合は、次のように考え直します。

計算による閏年の判定ロジック(2)

次のいずれかを満たす場合、その西暦年は閏年である。

  • 西暦年が400で割り切れる
  • 西暦年が4で割り切れて、100で割り切れない

これを関数式にすると、OR関数とAND関数を使って次のようになります。

=OR(MOD(A1,400)=0,AND(MOD(A1,100)<>0,MOD(A1,4)=0))

この式を使った表が次の画像です(赤が閏年、青が平年)。

実装例:Python

Python の場合、if else キーワードを使って3項演算子のように記述することができます。

a = "閏年" if year % 400 == 0 else "平年" if year % 100 == 0 else "閏年" if year % 4 == 0 else "平年"

ただし、かなり読みにくいので、ドヤるとき以外はおススメしません・・!

単純な判定をする場合は、次のような関数を定義すると使いやすいです。

def is_leap_year(year):

    if not year % 400:

        return True

    if year % 4 and not year % 100:

        return True

    return False

 

ほかの言語でプログラミングする場合も、この考え方を応用すると閏年を判定できます!

まずはこれらのコードを試したのち、自分で手を動かして確認してみてはいかがでしょうか!

 

PR

サーチバンクではマシュマロを設置しています。
ライターに聞いてみたい疑問や質問を募集中です。
記事の感想やご意見なども、よかったらお聞かせください。
https://marshmallow-qa.com/search_bank

この記事を書いたライター

ナガヤン

こんにちは、SEライターのナガヤンです!
サーチバンクをご覧いただき、ありがとうございます。

現役システムエンジニアの私だからこそできる、便利で楽しくなる情報を発信していきます!

これからの働き方を考えるメディア「JobTier」にて、対談記事を書いていただきました!

この記事に関連するラベル

ページトップへ