小笙's Blog

php mktime的一个坑2014.09.01 17:45

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

是不会存在问题的

  • 正在加载用户留言,请稍后~
点击这里取消回复

  • 请选择邮箱类型
  • @qq.com
  • @163.com
  • @sina.com
  • @126.com
  • @vip.qq.com
  • @sina.com.cn

:love: :kiss: :twist: :top: :shake: :bye: :han: :sleep: :lula: :rou: :happy: