最近在做一个文件夹清理脚本,文件夹是以 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' ); |
是不会存在问题的