2017-07-03 56 views
0

從下面的線 -時的strtotime怪異的行爲 - 號偏移

$date = strtotime('-' . (-100) . ' years'); 

我得到一個值4654765319當我嘗試這在我的本地代碼。在實際網站上嘗試時,同一行的值爲$date,因爲NULL。這一行不包含任何變量,所以其他代碼不會影響它。

我在本地得到正確的價值和生活,如果我刪除減號-i.e

$date = strtotime('-' . (100) . ' years'); 

給出了這兩種情況下相同的輸出-1656664323

任何人都可以明白爲什麼strtotime()在兩個平臺上的行爲與-符號不同嗎?

謝謝。

+0

您是否運行相同的PHP版本? – chris85

+0

是的,謝謝你的問候,兩人都在5。6.30 – jitendrapurohit

回答

3

很可能你正在運行一個32位版本的PHP。從PHP documentation注:

時間戳的有效範圍一般爲週五,1901年12月13日20點45分54秒UTC到星期二,2038年1月19日3時14分07秒UTC。 (這些是對應於最小值和最大值爲32位有符號整數日期)

您可以改爲使用PHP的DateTime類:

$date = new DateTime(); 
$date->modify('-' . (-100) . ' years'); 

echo $date->format('U'); 

eval.in

這裏有一個明確再現問題:

eval.in

+0

啊,eval.in使用32,我在3v41測試,並沒有在那裏複製。可能希望在eval(https://eval.in/826641)上顯示該問題是可重現的,並且這可以解決問題。 – chris85

+2

優秀 - 感謝您的回答。 – jitendrapurohit

+0

@ chris85好主意,編輯。沒問題jitendrapurohit – George

0
<?php 
echo '-' . (-100) . ' years'."\n"; 
echo '-' . (100) . ' years'."\n"; 

會打印出

--100 years 
-100 years 

第一個顯然是一個壞的日期字符串,該strtotime man page說,該函數將返回FALSE結果,這看起來像NULL,因此您的實際網站是否正常工作。我不知道爲什麼你的本地機器不會給出相同的結果 - 比較兩臺機器之間的配置 - 他們是否運行相同的操作系統和版本?

喬治取得低於他commment後,我寫了一個更完整的測試程序,我的64位計算機上:

<?php 
echo '-' . (-100) . ' years'."\n"; 
echo '-' . (100) . ' years'."\n"; 
echo ($d1=strtotime('-' . (-100) . ' years'))."\n"; 
echo ($d2=strtotime('-' . (100) . ' years'))."\n"; 
echo date('Y-m-d',$d1)."\n"; 
echo date('Y-m-d',$d2)."\n"; 

其打印出來

--100 years 
-100 years 
4654771244 
-1656662356 
2117-07-03 
1917-07-03 

我以前從來沒有嘗試過,但顯然strtotime()解釋爲--100-(-100)這是+100 - 所以我要說你的網站是一個工作不正常,可能是因爲我這是一個32位的環境。

+0

雖然你的想法是正確的,但['strtotime()'在處理'--'值時沒有問題。](https://eval.in/826639) – George