日付・時刻

【JavaScript】 生年月日から年齢を求めるいくつかの方法

更新日:2021/05/12

ここでは生年月日から年齢を計算する方法を2つ紹介します。
その前に、年齢についての定義についても把握しておきましょう。

 

年齢の定義

毎年誕生日が来れば歳を取る。
これは常識ですが、プログラムコードとして落とし込む場合は、常識なんて捨てる必要があります。

すなわち、ちゃんと裏どりをしましょうねということ。

で調べてみました。

まずはこれ。

① 年齢ハ出生ノ日ヨリ之ヲ起算ス
② 民法第百四十三条ノ規定ハ年齢ノ計算ニ之ヲ準用ス
③ 明治六年第三十六号布告ハ之ヲ廃止ス
e-gov法令検索:年齢計算ニ関スル法律より

明治35年に布告された3行しかない法律です。
②で民法第百四十三条を見ろと言ってます。

第百四十三条 週、月又は年によって期間を定めたときは、その期間は、暦に従って計算する。

2 週、月又は年の初めから期間を起算しないときは、その期間は、最後の週、月又は年においてその起算日に応当する日の前日に満了する。ただし、月又は年によって期間を定めた場合において、最後の月に応当する日がないときは、その月の末日に満了する。
e-gov法令検索:民法より

2を年齢計算に当てはめて要約すると、『生まれた日(起算日)の前日で一年の区切り(満了)とする』となります。
生まれた時間は関係がないということですね。

また、うるう年に生まれた人は4年に一回しか歳をとらないのか?という話題が時々出ますが、28日の最後(24時)に年齢が加算されているので、うるう年とか全く関係ないのです。

 

年齢計算例

JavaScriptでの年齢計算の方法はいくつかあります。
一応学習目的の記事なので、効率を考えずに挙げてみます。

なおコード中の関数は、引数として生まれた日と計測する日をDateオブジェクトで受け取る形に統一してあります。
Dateオブジェクトについては、次のページを読んでみてください。
【JavaScript】 日時と時刻を取得して表示してみる

単純に年から求める

まず、開始年から終了年までの年数を求めます。
この年数は終了年を含んでいるので、誕生日まで到達していない場合、1を減算しています。


const birthdate = "2020/2/29";

const ageCalculation = ( birthDate , nowDate ) => {
    const age = nowDate.getFullYear() - birthDate.getFullYear();
    const thisYearsBirthday  = new Date( nowDate.getFullYear() , birthDate.getMonth() , birthDate.getDate() );
    return age + ( thisYearsBirthday.getTime() > nowDate.getTime() ? -1 : 0 );
}

const age = ageCalculation( new Date(birthdate) , new Date() );

console.log( age + "歳" );

上のコードではnowDateがうるう年でない場合、thisYearsBirthdayが3月1日0時0分0秒に設定されます。
nowDateがthisYearsBirthday以上なら、誕生日が過ぎていることになります。

つまり、うるう年は特に気にしなくても大丈夫です。

なおageCalculation関数を3項演算子を駆使して一文にしてみます。


const ageCalculation = ( birthDate , nowDate ) =>
    nowDate.getFullYear() - birthDate.getFullYear()  +
    ( new Date( nowDate.getFullYear() , birthDate.getMonth() , birthDate.getDate() ).getTime()
        > nowDate.getTime() ? -1 : 0 );

こちらの方が、JavaScriptしている気になりますね!

年月日を数値に変換して減算する

年月日を年4桁月・日を各2桁の合計8桁の数値に変換して、その値を減算し、10000で割ると年数が計算できます。


const birthdate = "2020/2/29";

const ageCalculation = ( birthDate , nowDate ) => {
    const birthNumber = birthDate.getFullYear() * 10000 
                               + (birthDate.getMonth() + 1 ) * 100 
                               + birthDate.getDate();
    const nowNumber = nowDate.getFullYear() * 10000 
                               + (nowDate.getMonth() + 1 ) * 100 
                               + nowDate.getDate();

    return Math.floor( (nowNumber - birthNumber) / 10000 );
}

const age = ageCalculation( new Date(birthdate) , new Date() );

console.log( age + "歳" );

単純な計算のみで年齢を算出できます。

本当かな?と疑ってしまうのが正常な反応です。
ご自分で検証してみてください。

 

年ごとの誕生日の曜日を表示

最後に、現在までの年毎の年齢と誕生日及び曜日を表示してみます。


const birthdate = "2020/2/29";

const birthDayList = ( birthDate , nowDate ) => {
    const result = [];
    const [birthYear,birthMonth,birthDay] = 
                  [birthDate.getFullYear(),birthDate.getMonth(),birthDate.getDate()];
    const [nowYear,nowStumpTime] = 
                  [nowDate.getFullYear(),nowDate.getTime()];

    for( let year = birthYear ; year <= nowYear ; year ++ ){
        const date = new Date( year , birthMonth, birthDay );
        result.push({
            birthDay : `${date.getFullYear()}${date.getMonth()+1}${date.getDate()}日`,
            week: ["日","月","火","水","木","金","土"][date.getDay()],
            birthFlg: date.getTime() <= nowDate
        })
    }
    return result;
}

const ageList = birthDayList( new Date(birthdate) , new Date() );

ageList.forEach( (birthData,index) =>
    console.log( `${index}歳 誕生日${birthData.birthDay}${birthData.week}${birthData.birthFlg ? "" : "誕生日前です"}` )
);

単純に誕生年から現在までループをして、その年の誕生日と曜日を取得しているだけです。

デモ

生年月日:年 月 

更新日:2021/05/12

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。