首页 » PHP和MySQL Web开发(原书第4版) » PHP和MySQL Web开发(原书第4版)全文在线阅读

《PHP和MySQL Web开发(原书第4版)》21.3 在PHP中计算日期

关灯直达底部

在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年以前的时间戳。即使这样,这种计算通常也不是非常准确的,因为它不支持闰年,并且如果某人的生日刚好是冬令时和夏令时(或夏令时和冬令时)进行切换的午夜,这种计算也会出现错误。