處理日期和修飾符時,PHP DateTime 類別呈現出可能不總是符合我們期望的獨特行為。一個常見的場景涉及添加月份,而該類別的處理一開始可能是違反直覺的。
考慮以下程式碼片段:
$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";
如果我們希望程式碼將日期提前到1 日下個月及其後繼月份,我們會得到一個令人驚訝的結果:
2001-01-31 2001-03-03
我們得到的不是預期的2001-02-01,而是 2001-01-31。為什麼會發生這種情況?
DateTime 類別以考慮內部日期格式的方式處理月份新增。當我們在 12 月 31 日新增一個月時,內部日期變為 2001-02-31。然而,根據日曆,2001 年 2 月只有 28 天,因此 PHP 會自動調整到 3 月 3 日。
這不是一個錯誤,而是一個預期的行為,以確保日期始終保持在有效範圍內。
雖然 PHP的預設行為並不總是理想的,但有一些優雅的解決方案可以調整它:
手動幹預:
檢查下個月並手動添加正確的天數以提前到所需的天數date.
PHP 5.3的「第一天」修飾符:
對於PHP 5.3 及更高版本,您可以使用「第一天」修飾符前進到下個月的第一天:
$d = new DateTime( '2010-01-31' ); $d->modify( 'first day of next month' ); echo $d->format( 'F' ), "\n"; // Outputs "February"
以上是為什麼 PHP 的 DateTime::modify 在加入月份時表現異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!