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

时间:2011-05-26 10:44:22

标签: php date overflow strtotime

我有一个名为_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 Thu Sep 3 04:47:32 EDT 2009 i686 i686 i386 GNU / Linux
PHP 5.2.9

生产服务器(64位)=
Linux minicapella 2.6.18-164.15.1.el5.centos.plusxen#1 SMP Wed Mar 17 20:32:20 EDT 2010 x86_64 x86_64 x86_64 GNU / Linux
PHP 5.2.13

现在,在我追加

后,该功能运行良好
//append "> 0"
if ($timestamp = strtotime($param) > 0){

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

感谢您的建议 -rizkyabdilah

1 个答案:

答案 0 :(得分:3)

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”)解析为相应的时间戳。