PHP DateTime::modify 方法可以用來增加和減去月份。
P粉046387133
P粉046387133 2023-08-06 18:43:52
0
2
616
<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>
P粉046387133
P粉046387133

全部回覆(2)
P粉709307865

這是另一個完全使用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粉030479054

為什麼這不是一個錯誤:

目前的行為是正確的。以下是內部發生的情況:

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。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板