👌

[Python] 誕生日から年齢を算出する

2021/05/02に公開

誕生日から年齢を算出したい

自分の年齢の計算方法なんて考えたこともありませんでしたが、プログラムで年齢を表示する必要がある時に迷っちゃいますよね。

ということで誕生日から年齢を算出する方法を解説します。

[解決策] サンプルコード

解決するためのサンプルコードはこちらです。誕生日の年、月、日を引数にして年齢を返します。

import datetime


def age(year, month, day):
    today = datetime.date.today()
    birthday = datetime.date(year, month, day)
    return (int(today.strftime("%Y%m%d")) - int(birthday.strftime("%Y%m%d"))) // 10000

[解説] なぜこれで良いのか

パッと見でこれで良いのか?と思う方もいると思うので解説します。

誕生日を求める基本的な考え方

まずは誕生日の基本的な求め方を考えます。

  1. 現在の年から生まれた年を引いて、それを基準にする
  2. その年の誕生日を迎えていない場合は、基準から1を引く

普通に生活していて年齢の計算方法なんて意識しないですが、手順に書き起こすとこんな感じです。

例えば私は1995年生まれなので、2020年には25歳になりますが、誕生日がまだならば1を引いて24歳です。

コードに書き起こした手順を分解

以下の部分の解説をします。

(int(today.strftime("%Y%m%d")) - int(birthday.strftime("%Y%m%d"))) // 10000

todayとbirthdayはそれぞれ、今日と誕生日を表します。

  1. それぞれの日を%Y%m%dの形式にします。(例:1995年6月12日→19950612)
  2. %Y%m%d形式にした日付を整数型に変換します。
  3. 今日の日付の数値から、誕生日の数値をひきます。(例:20200721 - 19950612)
  4. 最後に残った値を10,000で割ります。(※切り捨て)

以上です。

例を見ながら確認する

例1:誕生日を迎えている場合

  • 現在 :2020年7月21日
  • 誕生日:1995年6月12日

( 20200721 - 19950612) / 10,000
= 250,609 / 10,000
= 25

例2:誕生日より前の場合

  • 現在 :2020年5月21日
  • 誕生日:1995年6月12日

( 20200521 - 19950612) / 10,000
= 249,909 / 10,000
= 24

この方法で算出できてしまう理由

よくできた計算式ですが、自分はぱっと見で本当にこれで良いの?って思ったので一応解説します。

%m%dの数値は、基本的に1月1日から12月31日まで、昇順に並びます。

そのため先ほどの例の通りで、誕生日を過ぎていない場合は、1,000の桁までがマイナスになるので、10,000以上の桁を繰り下げることになり、1歳分引くのと実質同じ処理になります。

反対に、誕生日を過ぎていれば、10,000以上の桁を繰り下げる必要がないので、単純に年の差が年齢になります。

まとめ

この方法はPythonに限らずどの言語で実装できるので参考にしてみてください。

Discussion