在PHP中,计算两个日期之间长度的最简单方法就是通过计算两个UNIX时间戳之差来获得。程序清单21-1所示的脚本中就使用了这种方法。
程序清单21-1 calc_age.php——根据某人的生日计算年龄
<?php
//set date for calculation
$day=18;
$month=9;
$year=1972;
//remember you need bday as day month and year
$bdayunix=mktime(0,0,0,$month,$day,$year);//get ts for then
$nowunix=time;//get unix ts for today
$ageunix=$nowunix-$bdayunix;//work out the difference
$age=floor($ageunix/(365*24*60*60));//convert from seconds to years
echo"Age is$age";
?>
在以上脚本中,我们设置了用以计算年龄的日期。在一个实际的应用程序中,该信息很可能来自一个HTML表单。首先,我们调用了mktime函数分别计算生日的时间戳和当前时间的时间戳:
$bdayunix=mktime(0,0,0,$month,$day,$year);
$nowunix=time;//get unix ts for today
因为这些日期具有相同的格式,因此,我们可以直接将它们相减。
$ageunix=$nowunix-$bdayunix;
现在,来处理一个有点棘手的问题——将这个时间段转化为更为友好的时间度量单位。这并不是一个时间戳,而是一个用秒钟量度的人的年龄。通过用一年的秒数来除当前以秒度量的年龄,将其转化为以年来度量。这样,我们就可以使用floor函数对所得结果进行取整处理,以20岁为例,到他20岁那年为止:
$age=floor($ageunix/(365*24*60*60));//convert from seconds to years
但是值得注意的是,该方法是有缺陷的,它受UNIX时间戳(通常是32位整型)范围的限制。生日计算并不是时间戳的很好应用。这个例子只适用于在所有平台下计算1970年以后出生的人的生日。Windows无法管理1970年以前的时间戳。即使这样,这种计算通常也不是非常准确的,因为它不支持闰年,并且如果某人的生日刚好是冬令时和夏令时(或夏令时和冬令时)进行切换的午夜,这种计算也会出现错误。