はじめに
Javaで年齢計算を扱うなら、LocalDateで生年月日と基準日を表し、Period.betweenで年単位の差を取り出す形が扱いやすくなります。その計算はプログラミング入門の題材としても相性がよく、日付型、条件分岐、入力処理、画面表示までを一連の流れで確認できます。
そのため、単に現在年から生年を引くだけではなく、誕生日が到来しているか、2月29日生まれをどう扱うか、入力値が正しい形式かまで整理しておく必要があるのが基本です。Javaの標準APIを使えば、年齢計算の多くは独自の暦計算を書かずに表現できます。
- Java 21 LTS
- OpenJDK 21 / 標準ライブラリ
java.timeとjavax.swing
公式仕様を確認する場合は、日付を表すOracle Java SE 21 LocalDate APIと、日付間の期間を扱うOracle Java SE 21 Period APIが一次情報になります。関連する基礎として、配列やコレクションの整理にはJava List型完全ガイド、うるう年の分岐にはJavaでうるう年を判定する解説も参照できます。
- Javaで年齢計算を行う基本構造
LocalDateとPeriodの使い方- 誕生日到来前やうるう年を考慮する考え方
- 入力値を使ったサンプルコードの読み方
- 人事管理、ヘルスケア、推薦処理への応用例
年齢計算の基本知識
Javaの年齢計算は、基準日と生年月日の差を年単位で求める処理です。結論から言えば、標準ライブラリのjava.timeを使い、LocalDateで日付を持ち、Period.betweenで差分を求める方法が現在のJavaでは自然です。
結果: 期待される出力は、実行日の年月日に応じて「年齢は XX 歳です。」という形式になります。
このコードでは、LocalDate.ofが固定の生年月日を作り、LocalDate.nowが実行時点の日付を取得します。その差はPeriodとして表され、getYearsで満年齢だけを取り出せますし、ここがポイントです。
| 要素 | 役割 | 代表的なAPI | 注意点 |
|---|---|---|---|
| 生年月日 | 計算の起点 | LocalDate.of | 月日は1始まりで渡します |
| 基準日 | 年齢を判定する日 | LocalDate.now | 実行日で結果が変わります |
| 期間 | 2日付間の差 | Period.between | 年、月、日に分かれます |
| 満年齢 | 経過した年数 | getYears | 誕生日未到来を含めて扱えます |
| うるう年 | 2月29日の考慮 | plusYears | 業務ルールの確認が必要です |
| 入力 | ユーザー値の受け取り | Scanner | 形式不正に備えます |
| 変換 | 文字列から日付へ変換 | LocalDate.parse | YYYY-MM-DD形式が前提です |
| 分岐 | 年齢帯の判定 | if / else if | 境界値を明確にします |
| 対応表 | 年齢帯と値の紐付け | HashMap | キー設計を統一します |
Javaとは
Javaは、クラスを中心に処理を組み立てるオブジェクト指向のプログラミング言語です。Webアプリケーション、業務システム、Android関連開発など幅広い用途で使われ、プログラミング入門でも文法と設計の基礎を学びやすい言語として扱われます。
一方、年齢計算のような日付処理では、古いDateやCalendarよりも、Java 8以降で追加されたjava.timeの使い方を押さえるほうが現実的です。LocalDate、Period、ChronoUnitは、年月日を明示的に扱えるため、コードの意図も読み取りやすくなります。
その考え方は、例外処理やコレクションを学ぶ場面にもつながりますが、これは押さえたい点です。入力値の扱いに不安がある場合はJavaエスケープ処理の基礎、メソッドの上書きやクラス設計を深めたい場合はJavaオーバーライドの解説が補助になります。
年齢計算の必要性
年齢計算は、会員登録、保険、医療、教育、人事管理、商品の推薦などで使われる処理です。たとえば年齢制限を満たすか判定する場合、単純な生年差では境界日の誤判定が起きるため、月日まで含めた判定が求められます。
そのため、Javaで年齢計算を書くときは、要件として「今日時点の満年齢」なのか、「年度末時点の年齢」なのか、「誕生日当日の扱いをどうするか」を先に決めますし、これが一つの目安です。この前提が曖昧なままサンプルコードを流用すると、業務ルールと計算結果がずれる可能性があります。
💡 Tips: プログラミング入門では、現在年から生年を引く式から始めても問題ありません。ただし実用寄りの年齢計算では、MonthやDayOfMonthを含む日付型で考えると整理しやすくなります。
Javaで年齢計算の作り方
Javaで年齢計算を作る流れは、基準日を用意し、生年月日を用意し、2つの日付差から満年齢を取り出す形になるのが目安です。使い方の核は短く、LocalDateで日付を作り、Period.betweenの戻り値からgetYearsを読むだけです。
具体的には、フォーム入力やファイル読込で得た文字列をLocalDate.parseで日付へ変換し、基準日としてLocalDate.nowまたは指定日を渡します。サンプルコードを読むときは、どの日付が「生年月日」で、どの日付が「判定日」なのかを区別すると理解しやすくなります。
詳細な使い方
基本式は現在年から誕生年を引く形ですが、誕生日がまだ来ていない年は1歳差し引く必要があるのがポイントです。その補正を自力で書く場合、ifで月日を比較するか、Period.betweenに任せるかを選びます。
一般に、プログラミング入門の段階では変数で計算の流れを見える形にし、慣れてきたらjava.timeのAPIに置き換える進め方が理解しやすいでしょう。Javaの年齢計算では、読みやすさと正確さの両方を保つことが大切になります。
変数の設定
年だけを使う最小の例では、int型の変数に現在年と誕生年を入れますが、覚えておくと役立つでしょう。この形は日付APIの前段として、変数、代入、引き算の関係を確認する用途に向いています。
結果: 期待される状態は、currentYearに2023、birthYearに1995が保持されることです。
この段階では年齢そのものはまだ計算していません。ただし、currentYear - birthYearという式を作れる準備が整い、後続の条件分岐で誕生日未到来の補正を加えられます。
計算方法
年だけの差分は単純ですが、誕生日がまだ到来していない場合は満年齢より1大きい値になります。そのため、月日を比較した結果に応じてageを減らす分岐が必要です。
結果: 期待される状態は、誕生日が未到来ならageが1小さくなり、到来済みなら生年差のまま残ることです。
このコードは考え方を示す断片であり、条件部分は実際の月日比較に置き換えますし、ここを基本と考えるとよいでしょう。JavaではbirthDate.plusYears(age)とcurrentDateを比べると、誕生日を過ぎたかどうかを表現しやすくなります。
365日で割る式だけに頼ると、うるう年や時刻差の影響で誤差が出ることがあります。学習用の概算なら使えますが、満年齢の判定にはLocalDateを使うほうが扱いやすくなるのが一般的です。詳細なサンプルコード
詳細なサンプルコードでは、Javaの標準APIを使った年齢計算、うるう年を含む判定、誕生日までの日数、利用者入力、GUIの使い方を順に確認します。各例は独立したpublic classとして書いているため、ファイル名とクラス名を合わせて実行する必要があります。
そのまま複数の例を同じフォルダで動かす場合は、同名のAgeCalculatorクラスが重複しないようにファイル名やクラス名を調整してください。サンプルコードの目的は、年齢計算の使い方を小さな単位で理解することです。
サンプルコード1:基本的な年齢計算
基本形では、生年月日をLocalDate.ofで作り、現在日付との差をPeriod.betweenで求めますし、ここがポイントです。Javaの年齢計算では、この形を起点に入力処理や業務分岐を足していくと読みやすくなります。
結果: 期待される出力は、実行日の年月日に応じて「年齢は XX 歳です。」という形式になります。
このサンプルコードでは、birthDateが生年月日、currentDateが基準日です。Period.betweenは年、月、日の差を持つPeriodを返し、period.getYears()で満年齢に相当する年数を取得できます。
ただし、LocalDate.nowは実行日によって値が変わりますが、これは押さえたい点です。テストや教材として出力を固定したい場合は、LocalDate.of(2026, 6, 21)のように基準日を明示する使い方もあります。
サンプルコード2:閏年を考慮した計算
2月29日生まれの扱いは、年齢計算で初心者がつまずきやすい点です。JavaのLocalDateは有効な日付だけを扱うため、うるう年の日付も型として安全に表現できます。
結果: 期待される出力は、実行日の年月日に応じて「あなたの年齢は XX 歳です」という形式になります。
この例ではChronoUnit.YEARS.betweenで年数を求め、birthDate.plusYears(years)が基準日より後なら1年戻します。うるう年の考慮はAPIが支援しますが、2月29日を平年の2月28日扱いにするか3月1日扱いにするかは、サービスの規約や業務ルールで決める領域です。
そのため、誕生日判定を伴うプログラムでは、法務や運用上の定義をコードコメントや仕様書に残すと読み手が迷いにくくなるのが現実的です。うるう年そのものの判定を学ぶ場合は、関連リソースのJavaでうるう年を判定するサンプルも役立ちます。
サンプルコード3:誕生日までの日数を計算
誕生日までの日数を求める処理は、年齢計算と同じく日付差分を扱います。ただしPeriod.getDaysは期間の日数部分だけを返すため、月をまたぐ総日数の計算には注意が必要です。
結果: 期待される出力は「誕生日までの日数は XX 日です。」という形式ですが、getDaysは総日数ではなく日付差分の日要素を返します。
このサンプルコードは、Periodの使い方を確認する短い例です。総日数を求めたい場合は、ChronoUnit.DAYS.between(today, birthday)を使うほうが目的に合います。
一方、誕生日まで「何か月と何日」のように表示したいなら、PeriodのgetMonthsとgetDaysが使えると整理できます。Javaの日付処理では、総量が必要なのか、年月日を分けた期間が必要なのかを先に決めるとミスを減らせます。
サンプルコード4:使用者の年齢を計算
利用者が入力した生年月日から年齢計算を行う場合は、Scannerで文字列を受け取り、LocalDate.parseで日付型へ変換します。プログラミング入門では、入力、変換、計算、出力の流れをひとつのmainで追える題材になると理解できます。
結果: 期待される出力は、入力した生年月日と実行日の関係に応じて「あなたの年齢は XX 歳です。」という形式になります。
このコードでは、scanner.nextLineが入力行を受け取り、LocalDate.parseがStringをLocalDateへ変換します。標準形式のYYYY-MM-DD以外を入力するとDateTimeParseExceptionが発生するため、実用では例外処理を追加すると覚えるとよいでしょう。
ただし、教材としては例外処理を省いたほうが処理の流れを追いやすい場合があります。実務寄りに広げるなら、try、catch、finally、scanner.closeを組み合わせ、入力不正時のメッセージを分ける構成が自然です。
サンプルコード5:GUIを用いた年齢計算アプリケーション
GUIで年齢計算を行う場合は、入力欄、ボタン、結果表示を画面に配置し、ボタン操作をきっかけに計算を実行します。Java標準のSwingを使うと、JFrame、JPanel、JLabel、JTextField、JButtonで小さな画面を作れますし、これが一つの目安です。
結果: 期待される表示は、yyyy-MM-dd形式で誕生日を入力して「計算」ボタンを押すと、画面上のラベルに年齢またはエラーメッセージが出る状態です。
このGUI例は、元記事の構成を保つためにSimpleDateFormatとDateを含めています。ただし現在のJavaで日付計算を書くなら、LocalDateとPeriodを使うほうが、うるう年や日付境界を扱いやすくなります。
そのため、画面部品の使い方を学ぶ例としては有効ですが、計算部分はjava.timeへ置き換えるのが現行の書き方です。Swingそのものは標準ライブラリに含まれるため、軽いデスクトップ教材として扱えますが、覚えておくと役立つでしょう。
サンプルコード5の計算部分をjava.timeへ置き換える例
GUIの枠組みはそのままに、年齢計算だけをjava.timeへ寄せると、計算意図が明確になります。この置き換えは、古い日付APIを学習目的で見たあとに現行の使い方へ進む橋渡しになります。
結果: 期待される出力は、基準日と入力日付に応じて「あなたの年齢: XX歳」という形式になると考えられます。
この断片はActionListenerの内部に組み込めます。SimpleDateFormat、ParseException、Dateを使わずに済むため、サンプルコード全体の見通しも良くなります。
DateやSimpleDateFormatは既存コードで見かけることがあると言えるでしょう。新しくJavaの年齢計算を書く場合は、公式ドキュメントが示すjava.time系APIを優先すると整理しやすくなります。Javaでの年齢計算の応用例とサンプルコード
年齢計算は単体で完結する処理ではなく、判定や推薦、スケジュール作成と組み合わせて価値が出ます。Javaで応用例を作るときは、年齢を求める処理と、年齢に応じて分岐する処理を分けると読みやすくなるのが基本です。
具体的には、人事管理では従業員の満年齢、ヘルスケアでは利用者への助言、ECでは商品推薦、動画サービスでは作品推薦のように、同じ年齢計算でも使い方が変わります。応用例ごとのサンプルコードでは、分岐条件の境界を明確に置くことがポイントになります。
応用例1:企業の人事管理システム
人事管理では、健康診断、資格更新、福利厚生、退職関連の判定などで年齢計算が使われますし、ここを基本と考えるとよいでしょう。Javaで書く場合も、従業員の生年月日をLocalDateで持ち、基準日時点の満年齢を取得する形が土台になります。
結果: 期待される出力は、実行日の年月日に応じて「従業員の年齢は: XX歳です」という形式になります。
このサンプルコードでは、birthDateを従業員の生年月日として固定しています。実際の人事管理システムでは、データベースから取得した値をLocalDateへ変換し、年度末や基準日を指定して計算するケースもあるのが目安です。
その場合は、LocalDate.nowに依存させず、LocalDate referenceDateのような引数として基準日を渡す設計が向いています。計算処理をメソッド化すれば、単体テストでも境界日を確認しやすくなります。
応用例2:ヘルスケアアプリ
ヘルスケアアプリでは、年齢帯に応じて表示するメッセージや運動メニューを変える応用例があるのがポイントです。医学的な助言を自動化する場合は専門的な監修や規約確認が必要ですが、学習用のサンプルコードでは条件分岐の練習として扱えます。
結果: 期待される出力は、入力した生年月日から求めた年齢に応じて、20歳未満、40歳未満、40歳以上のいずれかのメッセージが表示される形式です。
この例では、Scannerで受け取った文字列をLocalDate.parseで日付化し、Period.betweenで年齢を求めます。分岐はage < 20、age < 40、それ以外という順で評価されるため、条件の並びも結果に影響します。
ただし、ヘルスケアの表示文は利用者の健康判断に関わる可能性があるのが一般的です。学習用のプログラミング入門では文法理解に留め、公開サービスでは専門家監修、免責表記、個人情報保護の設計を別途検討する必要があります。
サンプルコード6:年齢に応じた商品推奨システム
商品推奨では、年齢帯とおすすめ商品を対応づける処理がよく使われます。JavaではHashMapに年齢帯のキーと表示文を入れ、年齢計算の結果に応じて取り出す構成にできるのが現実的です。
結果: 期待される出力は、実行日における年齢帯に応じて「推奨商品: 健康とウェルネスの商品」などの商品名が表示される形式です。
このサンプルコードでは、HashMap<String, String>に年齢帯と商品名を保持しています。getProductRecommendationメソッドに推薦ロジックを切り出しているため、年齢計算と商品選択の責務が分かれています。
一方、import java.util.Mapはこのコードでは直接使われていません。学習用には残しても動作上の問題はありませんが、読みやすさを優先するなら未使用のimportを削除すると整理できます。
応用例として会員ランクや年齢制限を扱う場合は、境界値のテストが欠かせません。たとえば19歳、20歳、29歳、30歳のような境界を入力し、ifの条件が意図どおり評価されるかを確認します。
サンプルコード7:年齢に応じた映画推薦システム
映画推薦では、入力された年齢そのものを使ってカテゴリを分ける簡易な応用例を作れます。生年月日から計算する例とは異なり、年齢をintとして受け取るため、条件分岐の使い方に集中できると理解できます。
結果: 期待される出力は、入力した年齢が12なら子ども向け、13以上18未満ならティーン向け、18以上なら大人向けの映画リストが表示される形式です。
この例ではScanner.nextIntで整数を受け取り、recommendMoviesメソッドへ渡します。age >= 13 && age < 18のように複数条件を組み合わせると、年齢帯を明示できます。
ただし、入力が数字以外の場合はInputMismatchExceptionが発生すると覚えるとよいでしょう。実用の使い方では、入力前に文字列として受け取り、Integer.parseIntと例外処理で不正入力を案内する構成が向いています。
💡 Tips: 応用例を広げるときは、年齢計算のメソッドと推薦メソッドを分けると変更しやすくなります。calculateAge、recommendMovies、getProductRecommendationのように目的が読める名前を付けると、コードレビューでも意図が伝わりやすくなると考えられます。
これらの応用例では、年齢計算そのものは短い処理に収まります。むしろ実際の設計では、年齢帯の境界、入力形式、個人情報の扱い、表示文の管理をどう分けるかが課題になります。
そのため、Javaのプログラミング入門としては、public static void mainに処理をまとめる形から始め、慣れてきたらstaticメソッドへ切り出すと理解が進みますし、ここがポイントです。大きなアプリケーションでは、計算ロジックをサービス層に置き、画面や入力処理から分離する設計が一般的です。
まとめ
Javaで年齢計算を行う中心は、LocalDateで生年月日と基準日を表し、Period.betweenで満年齢を求める流れです。現在年から生年を引く考え方も入口として使えますが、誕生日未到来やうるう年を含めるなら日付APIを使うほうが安定します。
その理解ができると、入力値を扱うScanner、分岐を作るif、対応表を持つHashMap、GUIを構成するSwingまで応用できます。年齢計算の使い方は、プログラミング入門の練習だけでなく、人事管理、ヘルスケア、商品推薦、映画推薦などの応用例へ自然につながりますが、これは押さえたい点です。
ただし、公開サービスで年齢を扱う場合は、入力チェック、例外処理、個人情報保護、基準日の定義を仕様として明確にする必要があります。サンプルコードを土台にする場合も、DateTimeParseException、InputMismatchException、境界値テストを追加し、利用目的に合う形へ調整します。
Javaの年齢計算を身につけると、日付型、条件分岐、標準入力、メソッド分割、コレクションの基礎をまとめて確認できると言えるでしょう。関連して、注釈の仕組みを深めるならJavaアノテーションの解説、リスト構造を扱うならJava List型の入門記事も学習の補助になります。
関連記事
- Java List型完全ガイド!初心者でもマスターできる7つのステップ
- Javaアノテーションの12選!初心者から上級者まで徹底ガイド
- Javaでうるう年を判定!初心者でも分かる9ステップ解説
- Javaエスケープ処理の10ステップマスターガイド
- Javaでマスターする!オーバーライドのたった7つのステップ
※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。


