PHP DateTime::modify 方法可以用來增加和減去月份。
P粉046387133
2023-08-06 18:43:52
<p>我一直在大量使用DateTime類,最近在新增月份時遇到了一個我認為是錯誤的問題。經過一些研究,發現這實際上不是一個錯誤,而是按照預期的方式運作。根據在這裡找到的文檔:</p>
<blockquote>
<p>Example #2 Beware when adding or
subtracting months</p>
</blockquote>
<pre class="brush:php;toolbar:false;"><?php
$date = new DateTime('2000-12-31');
$date->modify(' 1 month');
echo $date->format('Y-m-d') . "n";
$date->modify(' 1 month');
echo $date->format('Y-m-d') . "n";
?></pre>
<blockquote>
<pre class="brush:php;toolbar:false;">The above example will output:
2001-01-31
2001-03-03</pre>
</blockquote>
<p>有人能解釋為什麼這不被視為一個錯誤嗎? <br /><br />此外,有人有什麼優雅的解決方案來糾正這個問題,使得 1個月能按預期工作,而不是按設計意圖工作嗎? </p><p><br /></p>
這是另一個完全使用DateTime方法的簡潔解決方案,可以直接修改物件而不建立克隆。
它的輸出是:
為什麼這不是一個錯誤:
目前的行為是正確的。以下是內部發生的情況:
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處理這個下個月第一天的語句時,會發生以下情況:
next month將月份(原始為1)增加1。這使得日期變成了2010-02-31。
first day of將日期的天數設為1,結果是日期變成了2010-02-01。