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

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

关灯直达底部

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来获得年龄。如果对某人的生日进行如此计算,根据这个人一生可能经历的闰年数不同,年份生日可能会出现一年的偏差。