3 回答

TA貢獻1802條經驗 獲得超6個贊
這可能很有用:
echo Date("Y-m-d", strtotime("2013-01-01 +1 Month -1 Day"));
// 2013-01-31
echo Date("Y-m-d", strtotime("2013-02-01 +1 Month -1 Day"));
// 2013-02-28
echo Date("Y-m-d", strtotime("2013-03-01 +1 Month -1 Day"));
// 2013-03-31
echo Date("Y-m-d", strtotime("2013-04-01 +1 Month -1 Day"));
// 2013-04-30
echo Date("Y-m-d", strtotime("2013-05-01 +1 Month -1 Day"));
// 2013-05-31
echo Date("Y-m-d", strtotime("2013-06-01 +1 Month -1 Day"));
// 2013-06-30
echo Date("Y-m-d", strtotime("2013-07-01 +1 Month -1 Day"));
// 2013-07-31
echo Date("Y-m-d", strtotime("2013-08-01 +1 Month -1 Day"));
// 2013-08-31
echo Date("Y-m-d", strtotime("2013-09-01 +1 Month -1 Day"));
// 2013-09-30
echo Date("Y-m-d", strtotime("2013-10-01 +1 Month -1 Day"));
// 2013-10-31
echo Date("Y-m-d", strtotime("2013-11-01 +1 Month -1 Day"));
// 2013-11-30
echo Date("Y-m-d", strtotime("2013-12-01 +1 Month -1 Day"));
// 2013-12-31

TA貢獻1789條經驗 獲得超10個贊
這是另一個完全使用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

TA貢獻1719條經驗 獲得超6個贊
為什么它不是一個bug:
目前的行為是正確的。內部發生以下情況:
+1 month將月份數(原來為1)增加1。這就是約會2010-02-31。
第二個月(二月)在2010年只有28天,所以PHP自動更正了這一點,只是繼續計算從2月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";
?>
此腳本將正確輸出February。當PHP處理此first day of next month節時,會發生以下情況:
next month將月份數(原來為1)增加1。這使得日期為2010-02-31。
first day of將日期編號設置為1,導致日期為2010-02-01。
- 3 回答
- 0 關注
- 512 瀏覽
添加回答
舉報