日付から年齢を計算します。
法律上の満年齢ではなく、5月22日生まれなら5月22日に加算される年齢になります。
閏年の2月29日生まれは3月1日に加算されます。
もっともシンプルな方法は、日付を yyyymmdd 形式にして現在の日付から誕生日を引いて10000で割って端数切り捨てで丸める。
// タイムゾーンをUTCに変更する
$org_timezone = date_default_timezone_get();
date_default_timezone_set ( 'UTC' );
// 誕生日
$year = 1980;
$month = 5;
$day = 22;
$birthday = $year . '-' . str_pad ( $month, 2, 0, STR_PAD_LEFT ) . '-' . str_pad ( $day, 2, 0, STR_PAD_LEFT );
$birthday = str_replace ( '-', '', $birthday );
// 現在
$date = date ( 'Ymd', time () + 60*60*9 );
// 年齢を計算
$age = floor ( ( $date - $birthday ) / 10000 );
echo $age . '歳です';
// タイムゾーンを戻す
date_default_timezone_set ( $org_timezone );
次はタイムスタンプを使った方法です。
タイムスタンプを使えば年齢に加えて何秒経過したかまでわかるんですが、
やってみたらこれが意外と難しい・・・
経過日数までは出せるのですが、単純に365日で除算してしまうと閏年がある分微妙にずれてしまいます。
何回閏年があったかをチェックしてその分を調整しました。
// タイムゾーンをUTCに変更する
$org_timezone = date_default_timezone_get();
date_default_timezone_set ( 'UTC' );
// 誕生日
$year = 1980;
$month = 5;
$day = 22;
$birthday = gmmktime ( 0, 0, 0, $month, $day, $year );
// 現在
$time = time () + 60*60*9;
// 閏年が何回あったかチェック
$leap = 0;
for ( $year = 1980; $year <= date ( 'Y', $time ); $year++ ) {
if ( date ( 'L', gmmktime ( 0, 0, 0, 1, 1, $year ) ) )
$leap++;
}
if ( $month >= 3 )
$leap--;
if ( date ( 'n', $time ) == 1 || ( date ( 'n', $time ) == 2 && date ( 'j', $time ) <= 28 ) )
$leap--;
$passed = $time - $birthday - 60*60*24*$leap;
$age = floor ( $passed / ( 60*60*24*365 ) );
// 経過時間
echo $age . '歳です
';
echo floor ( ( $passed % ( 60*60*24*365 ) ) / ( 60*60*24 ) ) . '日と';
echo date ( 'H:i:s', $passed % ( 60*60*24*365 ) ) . 'が経過しています。';
// タイムゾーンを戻す
date_default_timezone_set ( $org_timezone );
まぁ使うことはなさそうですが。


