2011-05-26 70 views
3

我有PHP函數叫做_to_unix_timestamp() 代碼:PHP的strtotime給出不同的結果在64位

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 2.6.18 glustervm -164.el5xen#1 SMP星期四09月03日4時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 GN U/Linux的
PHP 5.2.13

現在的功能正在運行我追加

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

但是,我想知道爲什麼輸出是不同的後呢?

謝謝你的建議
-rizkyabdilah

+0

strtotime確實在不同的平臺上不確定有關32位或64位的事情......但是它不同。.. strtotime('0000-00-00')在本地機器上給出「false」,同時在服務器上返回一個負整數。 – codisfy 2013-02-05 11:08:53

回答

3

的strtotime作品通過閱讀你給它作爲一個字符串的東西,並試圖在某個地方找到它的日期。所以當你通過它「1306400175」它試圖找到一個年 - 月 - 日 - 小時...格式它知道它匹配,並且因爲它可能找到東西它返回一個值給你對應的一天它認爲他發現了。

換句話說,它不會像你想象的那樣工作,例如,如果你使用strtotime(「1400」),它會返回一個對應於今天14:00的TODAY的時間戳。所以你的代碼實際上在32位和64位都失敗了,因爲它是一個不同的結果,可能是因爲當整數的值超過PHP_INT_MAX時它會溢出(它達到它可能擁有的最高可能值,所以它會回到最低值可以有),這與32位和64位PHP不同。

您函數的一個實際的解決將是檢查參數是不是一個數字傳遞到的strtotime前:

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

雖然你需要確保你打算做什麼確實是解析日期/時間字符串(例如「2011-04-08 14:00」)轉換爲相應的時間戳。

+0

實際上,如果OP只是以格式化爲字符串的整數調用此函數,那麼只需執行strtotime(intval($ param))就可以了。 – GordonM 2011-06-10 08:48:05

相關問題