我有一个名为_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")解析为相应的时间戳。