生年月日8桁の数字から年齢、あるいは年齢の範囲から生年月日の範囲を計算する方法を調べた際のメモです。
年齢
生年月日8桁の数字があったとして、その値と現在時刻の差分から年齢を計算。コードは PHP です。
$birthday = '19710101';
$age = floor(((int)date('Ymd') - (int)$birthday) / 10000);
肝は2行目の「(現在の日付 – 生年月日8桁数字) / 10000 を切り捨て」しているところ。
サンプルなのでシンプルなコードにしていますが、実際はバリデーションをすることになると思います。
それと、法律によって厳密には年齢の算出方法が微妙に異なるようですが、ここでは一般的な年齢を算出するものとしています。
年齢の範囲から生年月日の範囲
こちらはやや特殊。例えば、20~29歳
や20代
という選択肢が与えられた際に、そこから生年月日の範囲を計算したい、というケースです。
<?php
/**
* 年齢から、生年月日の範囲を計算して両端の日付を返す
*
* @param int $age 年齢
* @return array 生年月日範囲の両端日付
*/
function getBirthdayRange($age)
{
$start = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y') - $age - 1);
$end = mktime(0, 0, 0, date('m'), date('d'), date('Y') - $age);
return [
date('Ymd', $start),
date('Ymd', $end)
];
}
$value_val_array = [
'20',
'29'
];
$value_val_arr = [];
$value_val_arr[] = (int)(getBirthdayRange((int)$value_val_array[1])[0]); // 年齢範囲の上限からその年齢範囲の最小値を使用
$value_val_arr[] = (int)(getBirthdayRange((int)$value_val_array[0])[1]); // 年齢範囲の下限からその年齢範囲の最大値を使用
var_dump($value_val_arr);
/*
* array (size=2)
* 0 => int 19920221
* 1 => int 20020220
*/
$value_val_arr = [];
$value_val_array = [
'40',
'49'
];
$value_val_arr[] = (int)(getBirthdayRange((int)$value_val_array[1])[0]); // 年齢範囲の上限からその年齢範囲の最小値を使用
$value_val_arr[] = (int)(getBirthdayRange((int)$value_val_array[0])[1]); // 年齢範囲の下限からその年齢範囲の最大値を使用
var_dump($value_val_arr);
/*
* array (size=2)
* 0 => int 19720221
* 1 => int 19820220
*/
上述のサンプルでは20~29歳
は 1992/2/21(29歳)~2002/2/20(20歳) の間、40~49歳
は 1972/2/21(49歳)~1982/02/20(40歳) (共に 2022/2/20 現在) ということになりますね。