php strtotime在64位上给出了不同的结果


php strtotime given different result on 64bit

我有一个名为_to_unix_timestamp()的php函数代码:

function _to_unix_timestamp($param){
    if ($timestamp = strtotime($param)){
        return $timestamp;
    }
    return (int) $param;
}

代码在我的开发服务器(32位)上运行良好
但是当我在生产服务器(64位)中部署应用程序时
该函数的输出与略有不同

示例

 // expected to be "int(1306400175)" but the output is "int(-56632154432)" 
 var_dump(_to_unix_timestamp("1306400175"));

在我的开发服务器上,输出为int(1306400175)
但在生产服务器上,输出为int(-56632154432)

只是信息开发服务器(32位)=
Linux glustervm 2.6.18-164.el5xen#1 SMP美国东部时间2009年9月3日星期四04:47:32 i686 i686 GNU/Linux
PHP 5.2.9

生产服务器(64位)=
Linux minicapella 2.6.18-164.15.1.el5.centos.plusxen#1 SMP美国东部时间3月17日星期三20:32:20 2010 x86_64 x86_64 GNU/Linux
PHP 5.2.13

现在,在我添加后,该功能运行良好

//append "> 0"
if ($timestamp = strtotime($param) > 0){

但是,我想知道为什么输出不同?

谢谢你的建议
-rizkyabdilah

Strtotime的工作原理是读取您作为字符串给出的内容,并尝试在其中的某个位置找到日期。因此,当您将其传递为"1306400175"时,它试图找到一个YEAR-MONTH-DAY-HOUR-。。。它知道与之匹配的格式,并且由于它可能确实找到了东西,它会向您返回一个值,该值对应于它认为他找到的日期。

换句话说,它并不像你想象的那样工作,例如,如果你执行strtotime("1400"),它将在14:00返回一个对应于TODAY的时间戳。因此,您的代码实际上在32位和64位都失败了,它之所以是不同的结果,可能是因为整数的值超过PHP_INT_MAX时溢出(它达到了可能的最高值,所以它回到了可能的最低值),这在32位到64位PHP之间是不同的。

函数的实际修复方法是在将param传递给strtotime:之前检查它是否不是数字

if (!is_numeric($param) && ($timestamp = strtotime($param)) {

尽管您需要确保您要做的确实是将日期/时间字符串(如"2011-04-08 14:00")解析为相应的时间戳。