php mktime的一个坑

最近在做一个文件夹清理脚本,文件夹是以 date('Ymd', time())来命名的,所以扫描文件夹,并把文件夹名称与当前时间作比对,如果是旧文件夹(3天前),则删除。

按说,逻辑非常清晰,处理起来不会有什么麻烦。

不过在测试mktime时,发现:

1
2
$t1=mktime(0, 0, 0, 09, 01, 2014);
$t2=mktime(0, 0, 0, 9, 1, 2014);

返回不同结果

纳了个闷了,难道是 09 != 9 ?
打印了一下果然不相等

1
2
var_dump(09==9);
boolean(false)

查看php手册Integer类型说明 发现 以0开头整数会被认为是八进制,而09是一个非法的八进制数,所以09会转换为0,这样就解释的通了。

不过之所以说mktime坑,是在手册中,mktime参数类型声明为整形

1
int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

但date("H")实际上是字符串类型

1
2
var_dump(date("H"))
string(2)

如果上面的测试换成

1
$t1=mktime('0', '0', '0', '09', '01', '2014');

是不会存在问题的

发表评论

电子邮件地址不会被公开。 必填项已用*标注