Practical PHP Programming

由成分组成日期

int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]])

程序员往往采用将年月日分别储存在不同的变量中策略来使运算更加方便,php提供了一个特别的函数,用于从日期的各个成分得到Unix时间戳:mktime()

在PHP所有的函数中,这个函数的参数顺序是最不同寻常的,我推荐你在遇到这个函数的时候就将其参数顺序记下来,不管你看的是这本书还是在线PHP手册。这个顺序是:小时、分钟、秒、月份、日子、年费、是否是夏令时。注意其中的“小时”应该是采用24时制的。

如果要组成2005年6月20日下午十点半,应该这么用mktime():

$unixtime = mktime(22, 30, 0, 20, 6, 2005, -1);

这里面唯一没有用的一个参数可能是最后一个:用来告诉PHP是否采用夏令时。这看起来有些奇怪,PHP当然知道是否应该启用夏令时,但是要考虑一下计算的难度。不同的国家进入夏令时的时间不同。另外一些国家,如德国,在1980年之后才启用夏令时。因此,PHP最后一个参数让你来选择:1表示启用夏令时,0表示不启用夏令时,-1表示让PHP自己判断。

利用mktimg()这个函数可以自动化的生成时间,也可以用来更正一些日期上的错误。例如,如果你想在当前时间上添加13个月,你无需自己计算具体的日期,你只要在月份这个参数(当前为6)加上13就好了:

$unixtime = mktime(10, 30, 0, 19, 20, 2005, -1);

很显然,月份中是没有19月的,PHP会在年份上加一,从月份中减12,之后再进行日期的计算。同样的,如果你在小时这个参数上加上9990,PHP会自动计算得到是416天之后。

作者说明:如果参数的数值小于10,直接写对应的数字,不要在前面加0。在PHP中,以0开头的数字被认为是八进制,传递给函数之后可能会导致不可预见的结果。例如,本来想说8,结果传递了一个08的参数,由于八进制最大的数是7,PHP会认为你传入的数字是0