2016-03-31 51 views
3

我剛剛注意到PHP日期函數的行爲很奇怪,有人可以解釋我做錯了什麼嗎?嘗試獲取上個月最後一天的奇怪PHP日期行爲

下面的代碼顯示同樣的結果

<?php 
echo date('Y-m-t'); 
// Outputs last day of this month: 2016-03-31 
echo date('Y-m-t', strtotime("-1 month")); 
// For some reason outputs the same: 2016-03-31 
echo date('Y-m-t', strtotime("+1 month")); 
// Outputs 2016-05-31 

這可能只是我太傻了,但可能有人解釋我爲什麼出現這種情況?

+3

這是所有記錄在GNU頁面PHP文檔清楚地鏈接到。 [Here](https://www.gnu.org/software/shishi/manual/html_node/Relative-items-in-date-strings.html#Relative-items-in-date-strings):'單位中的絨毛可能導致相關項目出現問題。例如,'2003-07-31 -1個月'可能評估爲2003-07-01,因爲2003-06-31是無效日期。 ' –

回答

11

當使用您的通話date('Y-m-t')t你指的是:

t - 你會弄清楚在給定月份

如果你試圖Y-m-d天數,它是2不同的日期:

<?php 

var_dump(date('Y-m-d')); 
var_dump(date('Y-m-d', strtotime('-1 month'))); 

st環(10) 「2016-03-31
串(10) 「2016-03-02

要解決這個問題,你可以使用strtotime格式last day of last month

<?php 

var_dump(date('Y-m-d')); 
var_dump(date('Y-m-d', strtotime('last day of last month'))); 

導致:

string(10)「2016-03-31
string(10)「2016-02-29

+0

感謝您的回覆,正如我以爲 - 這只是我的愚蠢:) – di3sel

+1

如果您想使用具有'\ DateInterval('P1M')''的\ DateTime()'sub可以做什麼?結果將與'-1月份'或'上個月'相同。 – walkingRed

+1

@walkingRed [爲什麼不簡單地使用' - >修改?](https://eval.in/545526) – h2ooooooo

6

試試date('Y-m-d', strtotime("-1 month")),這是什麼顯示? 3月2日。爲什麼?因爲2月31日不存在,所以PHP會進行日期滾動數學計算。

基本問題是,「減一個月」是非常模糊和生病的定義。什麼應該發生在像「2月31日」這樣的日期時?沒有好的或正確的答案。不要把它留給PHP來決定結果。如果您期望獲得明確的結果,請從月份的第一個明確扣除一個月。

相關問題