2015-04-24 107 views
1

因此,我試圖在PHP中將毫秒數轉換爲日期,我認爲我的腳本工作正常,但對於特定的毫秒值(1425318722000)出現奇怪的行爲。PHP將毫秒數轉換爲特定毫秒失敗(1425318722000)

我檢查這個跨越幾個網站,所有帶回來一個有效的價值...

星期一,2015年3月2日下午5時52分02秒GMT

星期一2015年3月2日17 :52:02

星期一2015年3月2日17時52分02秒GMT + 0000(GMT)

星期一,2015年3月2日17時52分02秒GMT

任何想法,爲什麼發生這種情況,它是一個PHP錯誤也許?

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318721999/1000));" 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(19) "2015-03-02 17:52:01" 
    ["timezone_type"]=> 
    int(1) 
    ["timezone"]=> 
    string(6) "+00:00" 
} 

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722000/1000));" 
bool(false) 

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722001/1000));" 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(19) "2015-03-02 17:52:02" 
    ["timezone_type"]=> 
    int(1) 
    ["timezone"]=> 
    string(6) "+00:00" 
} 

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722002/1000));" 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(19) "2015-03-02 17:52:02" 
    ["timezone_type"]=> 
    int(1) 
    ["timezone"]=> 
    string(6) "+00:00" 
} 

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722003/1000));" 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(19) "2015-03-02 17:52:02" 
    ["timezone_type"]=> 
    int(1) 
    ["timezone"]=> 
    string(6) "+00:00" 
} 

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722004/1000));" 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(19) "2015-03-02 17:52:02" 
    ["timezone_type"]=> 
    int(1) 
    ["timezone"]=> 
    string(6) "+00:00" 
} 

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722005/1000));" 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(19) "2015-03-02 17:52:02" 
    ["timezone_type"]=> 
    int(1) 
    ["timezone"]=> 
    string(6) "+00:00" 
} 
+0

我在想我應該做一些像php -r「var_dump( DateTime :: createFromFormat('U',round(1425318722001/1000)));「 – Carlton

+0

'DateTime'是否可以存儲毫秒? –

回答

3

這是你正在使用的'U.u'面具的事實,但.u從值時丟失的結果是十進制爲師

for($ms = 1425318721999; $ms <= 1425318722001; ++$ms) { 
    var_dump(DateTime::createFromFormat('U.u', sprintf('%14.3f', $ms/1000))); 
} 

將工作後都爲0,因爲您正在使用的sprintf()來強制這些零小數點

for($ms = 1425318721999; $ms <= 1425318722001; ++$ms) { 
    var_dump(DateTime::createFromFormat('U', floor($ms/1000))); 
} 

也將工作後要保留,但你會失去毫秒精度

通過一些解釋道:

public static DateTime DateTime::createFromFormat (string $format , string $time [, DateTimeZone $timezone ]) 

createFromFormat()需要一個字符串作爲第二個參數,所以PHP鬆動您鑄造師的結果爲一個字符串,像1425318722.000一個浮動值將被強制轉換到"1425318722"沒有小數點或跟隨零的字符串,所以它不符合U.u掩碼,它需要小數點和後面的數字

+0

剛剛發現一樣! – marijnz0r

+0

謝謝馬克,很好的解釋...順便說一句,希望你不介意複製你的ZF認證徽章的想法 – Carlton

+0

剛剛添加了一點解釋,爲什麼小數點和數字很重要,正在丟失 –