2014-12-23 99 views
-1

我很難得到日期來保持變量。當我打算從當前日期減去幾個月時,它會給我回0(默認回到1-1-1970)。PHP Date not sticking

有關我可能做錯什麼的想法?

PHP:

$progress = 5; 
$initialDate = date('m-d-Y'); 
echo "ini date: " . date('m-01-Y',$initialDate) . "<br>"; 
$date = date('m-01-Y', strtotime("-$progress months", strtotime(date('m-d-Y',$initialDate)))); 
echo "date: " . $date . "<br>"; 

輸出:

ini date: 12-01-2014 
date: 08-01-1969 
+1

這輸出不匹配你的代碼,日期的'第二個參數()'應該是一個時間戳,而不是格式化的日期。您應該保留日期作爲時間戳(或'DateTime'對象...),並且只在將它們輸出到瀏覽器時格式化它們。 – jeroen

+0

如果你打開PHP錯誤輸出,你會得到更多關於問題出現位置的想法 - 正如@jeroen所說,PHP會期待一個時間戳,在這個時間戳裏你傳遞一個格式化日期的字符串,這將導致一個PHP注意:「遇到一個非正確格式的數值...」 –

+0

PHP錯誤已打開,這正是我的代碼和輸出。 – Andrew

回答

3

的第二參數日期()必須在內部時間戳格式,自Unix紀元(1970年1月1即「的秒數00:00:00 GMT)「

strtotime()實際上是爲了將用戶輸入轉換爲內部日期格式。如果你想用日期做數學,最好使用更精確的方法。我建議在date_add()閱讀在這裏:http://php.net/manual/en/datetime.add.php

但是,你的代碼最簡單的解決方法是這樣的:

$progress = 5; 
    $initialDate = time(); // current timestamp, including seconds 
    echo "initialDate: $initialDate<br>"; 
    echo "ini date: " . date('m-01-Y',$initialDate) . "<br>"; 
    $date = date('m-d-Y', strtotime("-$progress months", strtotime(date('Y-01-d',$initialDate)))); 
    echo "date: " . $date . "<br>"; 

請注意,我用的Y型01-d格式送入的strtotime之日起,至回到本月1日起執行日期的功能之前,有兩個原因:

  • YMD格式沒有通過的strtotime錯誤地被解釋,不同於M/d/y和d/M/Y的危險。

  • 如果你要背5個月,從7月30日至2月1日,是比較安全的有7月1日作爲中間步驟,而不是28月「更安全」,意思是你甚至不需要測試是否strtotime正確處理2月28日。

+0

這個問題已得到解決,但這是一個很好的解決方案,幫助我達到了我需要的地方。謝謝湯姆! – Andrew

0

您也可以使用DateTime對象來做到這一點。我發現它本身更可靠。你基本上只是啓動一個DateTime對象,然後使用它的:: sub函數來減去$ progress月數的DateInterval。

$progress = 5; 
$initialDate = new DateTime(date("Y-m-01")); 
echo "ini date: ".$initialDate->format("m-01-Y")."<br />"; 
$date = $initialDate->sub(new DateInterval("P".$progress."M")); 
echo "date: ".$date->format("m-01-Y")."<br />"; 

輸出:

ini date: 12-01-2014 
date: 07-01-2014 
+0

對於7月30日你的代碼返回3月1日。它應該是2月1日。 –

+0

我想這是有道理的,因爲它將減去7月30日之前減去接下來的4個月,所以它轉換回去時結束1個月關閉到01.我只是改變它,以便設置初始日期時,它強制它使用一個月的第一天,所以月份數不會受到影響。 – Typel