my $now = time; とすれば、$now に 「1970 年 1 月 1 日から現在までの秒数」 の値が入る。そこで、ある人の誕生日を 1970 年からの秒数としてデータベースに
保存してある場合は、現在の時刻から誕生日の時刻を引き算してあげて年(365 日)、日(24 時間)、時(60 分)、分(60 秒)で割ってあげた整数値(int)を計算すれば、誕生日が求まるような気がする。しかしすぐに気づくのだがこの方法だけではうるう年が勘案されていないから、正確な誕生日は求められない。単純に 365 で割ったのでは誤差が出てしまうのである。
そこでどうすればいいかというと、365 という値を 「1年の正確な日数」 にして割ればよい。1 年というのは正確には
365.2425 日らしいので、「生年月日から現在までの日数」 を 「365.2425」 で割れば、正確な年齢を求めることができる。
#!/usr/bin/perl -w
use Time::Local;
$year = 1980;
$mon = 8;
$day = 24;
my $birthday = timelocal(0, 0, 0, $day, $mon - 1, $year);
$age = int((time - $birthday) / 365.2425 / 24 / 60 / 60);
print $age;
1;
my $now = time; とすれば、$now に 「1970 年 1 月 1 日から現在までの秒数」 の値が入る。そこで、ある人の誕生日を 1970 年からの秒数としてデータベースに
保存してある場合は、現在の時刻から誕生日の時刻を引き算してあげて年(365 日)、日(24 時間)、時(60 分)、分(60 秒)で割ってあげた整数値(int)を計算すれば、誕生日が求まるような気がする。しかしすぐに気づくのだがこの方法だけではうるう年が勘案されていないから、正確な誕生日は求められない。単純に 365 で割ったのでは誤差が出てしまうのである。
そこでどうすればいいかというと、365 という値を 「1年の正確な日数」 にして割ればよい。1 年というのは正確には
365.2425 日らしいので、「生年月日から現在までの日数」 を 「365.2425」 で割れば、正確な年齢を求めることができる。
#!/usr/bin/perl -w
use Time::Local;
$year = 1980;
$mon = 8;
$day = 24;
my $birthday = timelocal(0, 0, 0, $day, $mon - 1, $year);
$age = int((time - $birthday) / 365.2425 / 24 / 60 / 60);
print $age;
1;