JavaScriptを使用して年齢計算を実装することは、Webアプリケーション開発において非常に一般的なタスクです。

会員登録フォームやプロフィール画面など、ユーザーの生年月日から正確な年齢を導き出したい場面は多々あります。

一見すると単純な引き算で解決できるように思えますが、実は「今年の誕生日を過ぎているか」という判定を正確に行う必要があります。

この記事では、JavaScriptのDateオブジェクトを活用して、実務でそのまま使える正確な年齢計算のロジックを解説します。

初心者の方でも理解しやすいように、基本から応用までステップバイステップで進めていきましょう。

JavaScriptでの年齢計算における基本的な考え方

年齢を計算する際、最も単純な方法は「現在の西暦」から「誕生日の西暦」を引くことです。

しかし、この方法だけでは、誕生日前後の正確な年齢を算出することができません。

例えば、2000年12月31日生まれの人が、2026年1月1日時点で何歳かを考えてみましょう。

西暦の引き算だけを行うと「2026 – 2000 = 26歳」となりますが、実際にはまだ誕生日を迎えていないため25歳が正解です。

このように、「月」と「日」を比較して、今年の誕生日を通過したかどうかを判定するロジックが不可欠となります。

Dateオブジェクトの取得

JavaScriptで日付を扱うには、まず標準で用意されているDateオブジェクトを使用します。

現在の時刻を取得するには、引数なしでコンストラクタを呼び出します。

特定の誕生日を指定する場合は、引数に日付文字列や数値を渡してインスタンスを作成します。

比較に必要な要素

正確な年齢算出のために、以下の3つの要素を比較対象として抽出します。

  • 現在の年、月、日
  • 誕生日の年、月、日

これらの値を個別に取得し、条件分岐を用いて年齢を調整していくのが一般的なフローです。

実務で使える標準的な年齢計算ロジック

まずは、最も基本的かつ汎用性の高い計算方法を紹介します。

この手法では、年の差分を求めた後、if文を使って月日の判定を行います。

JavaScript
/**
 * 生年月日から年齢を計算する関数
 * @param {string} birthDateString - 'YYYY-MM-DD' 形式の文字列
 * @returns {number} 年齢
 */
function calculateAge(birthDateString) {
    const today = new Date();
    const birthDate = new Date(birthDateString);

    // 1. まずは年の差分を計算
    let age = today.getFullYear() - birthDate.getFullYear();

    // 2. 今月の値を取得(0〜11で返るため注意)
    const currentMonth = today.getMonth();
    const birthMonth = birthDate.getMonth();

    // 3. 誕生日を過ぎているか判定
    // 今月が誕生月より前か、もしくは誕生月だが誕生日の日に達していない場合
    if (currentMonth < birthMonth || (currentMonth === birthMonth && today.getDate() < birthDate.getDate())) {
        age--;
    }

    return age;
}

// 実行例
const myAge = calculateAge('1995-05-20');
console.log('現在の年齢は: ' + myAge + '歳です');
実行結果
現在の年齢は: 30歳です(※2026年5月20日以降に実行した場合)

ロジックのポイント

上記のコードで最も重要なのは、「age–」による減算処理です。

デフォルトで年の差を年齢とした後、誕生日がまだ来ていない場合にのみ1を引くことで、正確な数値を導き出しています。

getMonth()メソッドが「0」から始まる(1月が0)というJavaScript特有の仕様にも注意が必要ですが、比較演算においてはそのまま比較しても問題ありません。

数値変換を利用したスマートな年齢計算

より短く、簡潔に記述したい場合には、日付を「YYYYMMDD」形式の数値に変換して計算する方法があります。

この方法は、条件分岐を減らすことができるため、コードの可読性を高めるテクニックとして知られています。

JavaScript
function getAgeSimpler(birthDateString) {
    const today = new Date();
    const birthDate = new Date(birthDateString);

    // 今日をYYYYMMDD形式の数値にする (例: 20260520)
    const todayNum = (today.getFullYear() * 10000) + ((today.getMonth() + 1) * 100) + today.getDate();

    // 誕生日をYYYYMMDD形式の数値にする (例: 19950520)
    const birthNum = (birthDate.getFullYear() * 10000) + ((birthDate.getMonth() + 1) * 100) + birthDate.getDate();

    // 数値の差を10000で割り、小数点以下を切り捨てる
    return Math.floor((todayNum - birthNum) / 10000);
}

console.log(getAgeSimpler('1990-12-15'));
実行結果
35

この手法のメリット

この方法の最大のメリットは、if文による月日の比較が不要になる点です。

日付を8桁の整数として扱うことで、下4桁(月日)が現在の値より大きいか小さいかが、数値の大小関係にそのまま反映されます。

計算結果を10,000で割ることで、年の部分だけを整数として抽出できる非常に合理的なアルゴリズムです。

うるう年(2月29日生まれ)の扱いについて

年齢計算において意外と見落としがちなのが、うるう年の2月29日に生まれた方の扱いです。

日本の法律(年齢計算ニ関スル法律)では、誕生日の前日が終わる瞬間に加齢されると定められています。

JavaScriptのDateオブジェクトは、存在しない日付(うるう年以外の2月29日など)を自動的に翌日の3月1日として処理します。

JavaScriptでの挙動確認

JavaScript
const leapBirth = new Date('2024-02-29');
const checkDate = new Date('2025-02-28');

// 2025年はうるう年ではないため、2月29日は自動的に3月1日として扱われる場合がある
console.log('2024年2月29日の1年後を判定');

実務上のWebサービスでは、2月29日生まれの人は平年では2月28日に年齢が上がるとみなすか、3月1日に上がるとみなすかを要件定義で確認しておくことが重要です。

先述した「YYYYMMDD」形式の数値計算であれば、2月29日は「0229」、2月28日は「0228」として扱われるため、基本的には3月1日に年齢が変わる計算になります。

エラーハンドリングと入力値のバリデーション

ユーザーからの入力を受け取る場合、不正な日付形式が渡される可能性を考慮しなければなりません。

new Date()に無効な文字列を渡すと、結果は「Invalid Date」となります。

JavaScript
function safeCalculateAge(input) {
    const birthDate = new Date(input);

    // 日付として妥当かチェック
    if (isNaN(birthDate.getTime())) {
        return '無効な日付です';
    }

    // 未来の日付が入力されていないかチェック
    if (birthDate > new Date()) {
        return '未来の日付は指定できません';
    }

    // 計算処理へ...
    return getAgeSimpler(input);
}

このように、isNaN(date.getTime())を使用して、入力値が正しい日付オブジェクトであるかを確認する習慣をつけましょう。

また、未来の日付が入力された場合に「マイナスの年齢」が表示されないよう、ガード句を設けるのがプロフェッショナルな実装です。

年齢計算をより便利にするライブラリの紹介

プロジェクトの規模が大きく、日付操作が頻繁に発生する場合は、外部ライブラリの導入も検討しましょう。

ネイティブのDateオブジェクトは一部の操作が煩雑であるため、ライブラリを使うことでコードをさらに簡略化できます。

Day.jsの活用

Day.jsは、軽量でモダンな日付操作ライブラリです。

diffメソッドを使用することで、驚くほど簡単に年齢を求めることができます。

JavaScript
// Day.jsを使用した場合
const age = dayjs().diff('1995-05-20', 'year');
console.log(age);

自前でロジックを書く必要がなく、「’year’」という単位を指定するだけで端数処理まで考慮した計算が行えます。

ただし、単純な年齢計算だけのためにライブラリを導入するのはオーバーヘッドになるため、用途に応じて使い分けるのが賢明です。

まとめ

JavaScriptでの年齢計算は、単なる年の引き算ではなく、月日の詳細な比較が不可欠です。

基本に忠実な「if文による判定」と、コードを簡潔にする「YYYYMMDD数値化手法」の2種類を理解しておけば、あらゆる場面に対応できるでしょう。

実装の際は、以下のポイントを必ず確認してください。

チェック項目重要性理由
誕生日の前後判定1歳の誤差を防ぐため
入力値の妥当性不正な値によるエラーを防ぐため
うるう年の考慮低〜中特定の日付における法的・ビジネス要件への対応

正確なコードを書くことは、ユーザーの信頼を守ることにも繋がります。

今回紹介した基本コードをベースに、ご自身のプロジェクトに最適な形でカスタマイズして活用してみてください。