P粉7093078652023-08-07 13:27:57
這是另一個完全使用DateTime方法的簡潔解決方案,可以直接修改物件而不建立克隆。
$dt = new DateTime('2012-01-31'); echo $dt->format('Y-m-d'), PHP_EOL; $day = $dt->format('j'); $dt->modify('first day of +1 month'); $dt->modify('+' . (min($day, $dt->format('t')) - 1) . ' days'); echo $dt->format('Y-m-d'), PHP_EOL;
它的輸出是:
2012-01-31 2012-02-29
P粉0304790542023-08-07 09:48:12
目前的行為是正確的。以下是內部發生的情況:
1個月會將月份(原始為1)增加1。這使得日期變成了2010-02-31。
2010年的二月只有28天,所以PHP會自動修正這個問題,繼續從二月1日開始計算天數。因此,最終得到的日期是3月3日。
如何得到你想要的結果:
要得到你想要的結果,可以手動檢查下個月,然後加上下個月的天數。
希望你能自己寫這段程式碼。我只是提供了具體的操作步驟。
PHP 5.3的方法:
為了得到正確的行為,你可以使用PHP 5.3所引入的相對時間語句「first day of」。這個語句可以與「next month」、「fifth month」或「 8 months」結合使用,以前往指定月份的第一天。與你目前使用的「 1 month」相比,你可以使用以下程式碼來獲得下個月的第一天:
<?php $d = new DateTime( '2010-01-31' ); $d->modify( 'first day of next month' ); echo $d->format( 'F' ), "\n"; ?>
這個腳本將正確輸出二月。當PHP處理這個下個月第一天的語句時,會發生以下情況:
next month將月份(原始為1)增加1。這使得日期變成了2010-02-31。
first day of將日期的天數設為1,結果是日期變成了2010-02-01。