【Java】うるう年の判定方法を徹底解説!条件・一覧表・Excel数式も紹介

うるう年の判定方法_アイキャッチ画像 Java

「うるう年ってどうやって判定するの?」

「Javaではどうやって書けばいいの?」

と言う方のために、うるう年の判定ロジックと、Javaでの実現方法を解説していきます。

Javaでの実現方法だけ知りたい方は、3章に飛んでください。うるう年の歴史や豆知識まで知りたい方は1章から読んでもらえると幸いです。

うるう年とは?

うるう年とは、暦のズレを修正するために4年に1度、1年間の日数を1日だけ増やす年のことです。

現在、日本をはじめ世界の多くの国では「太陽暦」が使われており、1年は365日とされています。

これは、地球が太陽を1周するのにかかる日数をもとにしていますが、正確には1年で約5時間49分足りていません。そのため、4年間で約24時間(1日)分のズレが生まれ、これを調整するために4年に1度、2月に29日を設けているのです。

しかし、「4年に1度29日を追加する」だけでは、1年あたり約11分増やしすぎてしまいます。そこで、「100で割り切れ、400で割り切れない年はうるう年にならない」というルールが定められました。これにより、100年、200年、300年は4の倍数でもうるう年にならず、400年に3回だけうるう年がスキップされる仕組みになっています。

(さらに厳密な時刻の調整には「うるう秒」という別の仕組みも存在します。詳しくは後述の豆知識で解説します。)

グレゴリオ暦とユリウス暦の違い

現在私たちが使っているこの暦のルールは「グレゴリオ暦」と呼ばれています。1582年、ローマ教皇グレゴリウス13世が、それまで使われていた「ユリウス暦」のズレを修正するために制定しました。

ユリウス暦では単純に「4年に1度うるう年を入れる」というルールだけだったため、長い年月の間に暦と季節が少しずつズレてしまうという問題がありました。グレゴリオ暦ではここに「100で割り切れる年は原則うるう年としない」「ただし400で割り切れる年はうるう年とする」という例外ルールを加えることで、より精密に季節とのズレを抑えています。国立天文台(NAOJ)によると、このルールのおかげで、グレゴリオ暦は約3300年で1日程度のズレしか生じないとされています。

うるう年の判定ルールをわかりやすく解説

判定の3つの条件

うるう年の判定は、以下の3つの条件を順番に確認することで行えます。

条件 判定結果
4で割り切れない うるう年ではない
4で割り切れる かつ 100で割り切れない うるう年である
4で割り切れる かつ 100で割り切れる かつ 400で割り切れない うるう年ではない
4で割り切れる かつ 100で割り切れる かつ 400で割り切れる うるう年である

言葉だけでは分かりづらいと思うので、以下にフローチャートも示しておきます。

うるう年の判定フローチャート

【一覧表】うるう年になる年・ならない年の実例

実際にどの年がうるう年になるのか、具体的な西暦で確認してみましょう。

西暦 うるう年? 理由
2020年 ○うるう年 4の倍数、100の倍数ではない
2024年 ○うるう年 4の倍数、100の倍数ではない
2028年 ○うるう年 4の倍数、100の倍数ではない
2032年 ○うるう年 4の倍数、100の倍数ではない
2100年 ×うるう年ではない 100の倍数だが400の倍数ではない
2200年 ×うるう年ではない 100の倍数だが400の倍数ではない
2300年 ×うるう年ではない 100の倍数だが400の倍数ではない
2000年 ○うるう年 100の倍数であり、かつ400の倍数
2400年 ○うるう年 100の倍数であり、かつ400の倍数

基本的には「4の倍数の年はうるう年」と覚えておけば問題ありませんが、西暦の下2桁が「00」になる年(世紀の切り替わりの年)だけは、400で割り切れるかどうかを確認する必要がある、という点がポイントです。

次のうるう年はいつ?

2026年現在、直近のうるう年は2028年です。その後は2032年、2036年と4年おきに続いていきます。

前述の例外ルールが関わってくるのは2100年で、2100年は4の倍数ではありますが100の倍数かつ400の倍数ではないため、うるう年にはなりません。次に例外が発生するタイミングとして覚えておくとよいでしょう。

Javaでうるう年を判定する方法

ここからは、Javaで実際にうるう年を判定するプログラムを書いていきます。

うるう年は、基本的には4の倍数です。しかし、先述の通り「100で割り切れ、400で割り切れない年」はうるう年から除外されます。

以下が、実際のコードです。

int year = 2020; //判定する年

if(year % 4 != 0){
    //4の倍数でない場合
    System.out.println(year + "年はうるう年ではありません");
}else if(year % 100 != 0){
    //4の倍数であり、100の倍数でない時
    System.out.println(year + "年はうるう年です");
}else if(year % 400 != 0){
    //4の倍数であり、100の倍数であり、400の倍数でない
    System.out.println(year + "年はうるう年ではありません");
}else{
    //4の倍数であり、100の倍数であり、400の倍数である
    System.out.println(year + "年はうるう年です");
}

//実行結果
//2020年はうるう年です

2020年は4の倍数であり、100の倍数ではないので、6行目からのelse if文に入ります。そのため、実行結果は「2020年はうるう年です」となります。

なお、Javaにはjava.time.YearクラスのisLeap()メソッドを使って、もっと簡潔に判定する方法もあります。

import java.time.Year;

int year = 2020;
boolean isLeapYear = Year.isLeap(year);
System.out.println(year + "年はうるう年:" + isLeapYear);

//実行結果
//2020年はうるう年:true

if文でロジックを理解したあとは、こうした標準ライブラリの活用も検討してみてください。

Excel・関数でうるう年を判定する方法

プログラミングを使わず、Excelの数式だけでうるう年を判定することもできます。Microsoft Learnでは、DATE関数とDAY関数を組み合わせた判定方法が紹介されています。

=DAY(DATE(year,3,0))=29

この数式は、「指定した年の3月0日(=2月の最終日)が29日かどうか」を判定する仕組みです。29日であれば2月が29日まであるということなので、うるう年と判定されます。

セルA1に判定したい年(例:2024)を入力している場合は、以下のように書けます。

=DAY(DATE(A1,3,0))=29

結果がTRUEであればうるう年、FALSEであればうるう年ではないことを意味します。IF関数と組み合わせれば、「うるう年です」「うるう年ではありません」といった文字列を表示することも可能です。

=IF(DAY(DATE(A1,3,0))=29,"うるう年です","うるう年ではありません")

他の言語でのうるう年判定方法

Java以外の言語でも、同じロジックで判定できます。代表的な言語のサンプルコードも紹介します。

Pythonでのサンプルコード

year = 2020

if year % 4 != 0:
    print(f"{year}年はうるう年ではありません")
elif year % 100 != 0:
    print(f"{year}年はうるう年です")
elif year % 400 != 0:
    print(f"{year}年はうるう年ではありません")
else:
    print(f"{year}年はうるう年です")

# 実行結果
# 2020年はうるう年です

Pythonには標準ライブラリcalendarモジュールのisleap()関数もあり、calendar.isleap(2020)と書くだけでTrueが返ってきます。

JavaScriptでのサンプルコード

const year = 2020;

if (year % 4 !== 0) {
    console.log(`${year}年はうるう年ではありません`);
} else if (year % 100 !== 0) {
    console.log(`${year}年はうるう年です`);
} else if (year % 400 !== 0) {
    console.log(`${year}年はうるう年ではありません`);
} else {
    console.log(`${year}年はうるう年です`);
}

// 実行結果
// 2020年はうるう年です

どの言語でも、条件分岐の考え方は共通です。「4の倍数か」「100の倍数か」「400の倍数か」という3段階の判定を順番に行う、という基本ロジックを押さえておけば、他の言語への応用も簡単です。

うるう年に関する豆知識

うるう秒とは?うるう年との違い

「うるう秒」は、うるう年とは別の時間調整の仕組みです。地球の自転速度は一定ではなく、潮の影響などによって微妙に変動するため、時計が示す時刻と天文学的な時刻の間にわずかなズレが生じます。このズレを調整するために、不定期に1秒を追加・削除する仕組みが「うるう秒」です。

うるう年は「暦(カレンダー上の日付)」のズレを調整する仕組みであるのに対し、うるう秒は「時刻そのもの」のズレを調整する仕組みという点が大きな違いです。うるう秒は数年に1度のペースで実施されるかどうかが決定され、必ず4年に1度訪れるうるう年とは発生のタイミングも性質も異なります。

2月29日生まれの人はいつ年を取る?

2月29日生まれの人(通称「うるう年生まれ」)は、うるう年以外の年には2月29日が存在しないため、「いつ年を取るのか」という疑問を持たれることがあります。

日本では「年齢計算ニ関スル法律」により、誕生日の前日の終了時(午後12時)に1歳年を取ると定められています。つまり2月29日生まれの人は、平年には2月28日の終了時点(=3月1日の午前0時)で年を取ることになります。ほいくらしでも、この法律に基づいた年齢計算のルールが詳しく解説されています。

オリンピックとうるう年の関係

夏季オリンピックは4年に1度開催されるため、「オリンピックの年=うるう年」というイメージを持っている方も多いのではないでしょうか。実際、2016年(リオ)、2020年(東京)、2024年(パリ)はいずれもうるう年でした。

ただし、これは厳密なルールというわけではなく、両方が「4年周期」で設定されているために起こる一致です。2100年のように、4の倍数であってもうるう年にならない例外の年が将来発生した場合、オリンピックの開催年とうるう年がズレる可能性も理論上はあります。あくまで雑学として覚えておくとよいでしょう。

まとめ

うるう年とは?
 4年に1回訪れる、1年が1日多い年。グレゴリオ暦のルールに基づき、暦と季節のズレを調整するために設けられている。

うるう年の判定方法
 ・「4の倍数」かつ「100の倍数でない」
 ・「4の倍数」かつ「100の倍数」かつ「400の倍数」

次のうるう年
 2028年(以降4年おきに続く。例外は2100年)

Javaでのif文を使った判定方法に加え、Excelの数式やPython・JavaScriptでの実装方法も紹介しました。用途に合わせて使い分けてみてください。

参考にしたサイト

コメント

タイトルとURLをコピーしました