int mktime ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )
根据给出的参数返回 Unix 时间戳。时间戳是一个长整数,包含了从 Unix 纪元(January 1 1970 00:00:00 GMT)到给定时间的秒数。
参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值
int gmmktime ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )
和 mktime() 完全一样,只除了返回值是格林威治标准时的时间戳。
参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。
和 mktime() 一样,参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。
PHP手册的介绍很模糊,下面来看两个例子:
首先将php.ini中的date.timezone 设置为 date.timezone = PRC
<?php
$ltime = mktime();
$gtime = gmmktime();
echo "$ltime<br/>$gtime<br/>";
?>
$ltime = mktime();
$gtime = gmmktime();
echo "$ltime<br/>$gtime<br/>";
?>
输出结果如下:
1315311558
1315311558
1315311558
两个函数的返回结果是一样的, 按我的理解一个返回本地时间的时间戳,一个返回GMT时间的时间戳,应该相差八小时才对。
再看一个例子:
<?php
$ltime = mktime(0,0,0,1,1,1990);
$gtime = gmmktime(0,0,0,1,1,1990);
echo "$ltime<br/>$gtime<br/>";
?>
$ltime = mktime(0,0,0,1,1,1990);
$gtime = gmmktime(0,0,0,1,1,1990);
echo "$ltime<br/>$gtime<br/>";
?>
631123200
631152000
631152000
(631152000-631123200)/3600=8,刚好相差8个小时,这就对了。
对以上两个例子的分析:
(1)在第一个例子中尽管gmmktime返回的是当前GMT时间的时间戳,但是默认参数传进去也是当前GMT时间的时、分、秒 、月、日、年,而mktime默认参数穿进去的是当前本地时间的
时、分、秒 、月、日、年,这样的话在mktime中将时间转换为GMT时间后会与gmmktime的参数值一样,所以他们的返回值一样
(2)在第二个例子中,mktime和gmmktime两个传进去的参数值都是固定死的1990-01-01 00:00:00,所以在mktime中会将1990-01-01 00:00:00转换为GMT时间再计算时间戳,而北京时间比GMT时间大8个时区,所以mktime的计算方法是将1990-01-01 00:00:00减去8个小时,这就是为什么gmmktime的返回值比mktime的返回值大8个小时的原因了。