PHP没有提供更多内置的日期操作函数。很明显,我们可以编写自己的函数,但是务必考虑闰年和时令切换的时间。另一个选择是下载别人的函数。在PHP手册中,可以找到许多用户编写的函数,但是只有很少的一部分才是考虑全面的。
提示 在PHP 5.3版本中,增加了一些日期计算函数,包括date_add、date_sub和date_diff函数。这些日期操作函数消除了必需使用MySQL来提供PHP以前版本所缺少的日期操作函数。
一个并不是非常好的选择是使用MySQL。MySQL提供了大量的日期操作函数,这些函数适用于UNIX时间戳以外的可供日期范围。必须连接MySQL服务器来运行一个MySQL查询,但是不使用数据库的数据。
如下所示的查询在1700年2月28日的基础上增加了一天,并且返回了结果日期:
select adddate('1700-02-28',interval 1 day)
1700年不是闰年,因此其结果是1700-03-01。
在MySQL手册中,可以找到大量描述和修改日期和时间的语法,网址为:http://www.mysql.com/doc/en/Date_and_time_functions.html。
不幸的是,要获得两个日期之间的年数并不是一件容易的事情,因此生日例子还存在一些问题。我们可以很容易获得以天为单位的某人年龄,程序清单21-2所示的代码将年龄转换为年份,这并不是非常准确的。
程序清单21-2 mysql_calc_age.php——使用MySQL来计算某人基于生日的年龄
<?php
//set date for calculation
$day=18;
$month=9;
$year=1972;
//format birthday as an ISO 8601 date
$bdayISO=date("c",mktime(0,0,0,$month,$day,$year));
//use mysql query to calculate an age in days
$db=mysqli_connect('localhost','user','pass');
$res=mysqli_query($db,"select datediff(now,'$bdayISO')");
$age=mysqli_fetch_array($res);
//convert age in days to age in years(approximately)
echo"Age is".floor($age[0]/365.25);
?>
在将生日格式化成一个ISO时间戳后,可以将如下所示的查询提交给MySQL:
select datediff(now,'1972-09-18T00:00:00+10:00')
MySQL的now函数通常将返回当前的日期和时间。MySQL的datediff函数(在PHP 4.1.1版本引入)将两个日期相减并返回日期的差。
以上脚本的执行并不需要从一个表格选择数据,甚至选择一个数据库,但是必须使用有效的用户名和密码登录到一台MySQL服务器。
由于没有特定的内置函数可以用于这种计算,因此用来计算确切年份的SQL查询就比较复杂。这里,我们采用了捷径,用日期年龄除以365.25来获得年龄。如果对某人的生日进行如此计算,根据这个人一生可能经历的闰年数不同,年份生日可能会出现一年的偏差。