Practical PHP Programming

从字符串转换

int strtotime ( string time [, int now])

从用户输入转换为Unix时间戳格式可能相当棘手,因为有的人用DD/MM/YY格式,有的人用YY-MM-DD,有的人用DDDD-MM-YYYY格式,千奇百怪。

PHP提供了一个函数来帮你从字符串转换为时间戳,而且效果不错。strtotime()就是这个函数,它有两个参数:第一个参数是要转换的时间字符串,第二个是可选参数,是一个相对时间戳。第一个参数很重要,第二个参数稍后再讲解。

来开一下这个代码:

<?php
    print strtotime("22nd December 1979");
    print strtotime("22 Dec. 1979 17:30");
    print strtotime("1979/12/22");
?>

这里,我们用三种不同的方式来表示相同的日期,第二种方式还提供了一个具体时间。如果你运行代码的话,会看到PHP为每种方式都返回了一个整型的数字,其中第一种和第三种相同,第二种的数字稍微大一些。这些数字就是我们传递给strtotime()后返回的Unix时间戳,能看到返回结果,说明函数成功转换。

注意strtotime()使用的是美式日期表达方式,也就是说,如果输入10/11/2003这样的日期,会被认为是10月11日而不是11月10日。

如果PHP不能将字符串转换为时间戳,将会返回-1。你可以巡行一下下面的代码,来看看日期是否被成功转换:

<?php
    $mydate = strtotime("Christmas 1979");
    if ($mydate == -1) {
        print "Date conversion failed!";
    } else {
        print "Date conversion succeeded!";
    }
?>

现在来看看strtotime()的第二个可选参数,也就是相对日期时间戳。这个参数存在的原因是因为传递给strtotime()的第一个参数可能是类似“下周六”、“两天”、“一年前”这种相对日期。在这种情况下,PHP需要知道这个相对日期的基准时间。你可以随便传入一个时间戳,PHP将会以此为基准输出“下周六”的时间戳。如果你没给出第二个参数,又使用了相对日期的话,PHP会假设你参考的是当前时间。

下面是使用方法示例:

<?php
    print strtotime("Next Sunday");
    print strtotime("2 days", time() - (86400 * 2));
    print strtotime("1 year ago", 123456789);
?>

第一行将会输出下周六的时间戳,第二行用time()减去两天作为第二个参数,用“两天”作为第一个参数,也就是返回当前的时间戳。最后一个例子返回从给定时间一年之前的时间戳。

从日期文本转换为可使用的日期格式实际并不容易,正是由于PHP的这个内建函数,才是个转换如此方便。你可以试试不同的字符串,看看哪些能转换成功,哪些转换失败。

作者说明:注意一下,像August 25, 2003, 10:26am.这种在我们看起来很明确的日期,因为其中含有逗号,strtotime()反而无法处理。所以,当你要处理日期的时候,需要先用str_replace()将逗号去掉。