2018年9月6日 星期四

PHP strtotime 月份加減

PHP 的 strtotime 可以進行月份的加減。
但 PHP 進行時,會保留原來的「日」,再判斷是否需進行時間的偏移,所以可能導致最終的日期跟預想的不一樣。
例如:
$cur_date = "2016-03-31";
var_dump(date("Y-m-d", strtotime("-1 month", strtotime($cur_date))));//2016-03-02
var_dump(date("Y-m-d", strtotime("+1 month", strtotime($cur_date))));//2016-05-01
2016-03-31 減一個月變成 2016-02-31,但2016年2月只到29號,所以 2016-02-31 => 2016-03-02
2016-03-31 加一個月變成 2016-04-31,但4月只到30號,所以 2016-04-31 => 2016-05-01

這結果,可能跟預想的不太一樣。
但如果只是要取月份加減後的月初、月底,或只著重在結果的月分準確即可,
那可使用「first day of」(取月初)、「last day of」(取月底)來處理。
加減過程中,沒了原本的「日」,也就沒最後因為「日」而導致月份的偏移了。
$cur_date = "2016-03-31";
var_dump(date("Y-m-d", strtotime("first day of -1 month", strtotime($cur_date))));//2016-02-01
var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime($cur_date))));//2016-02-29
var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime($cur_date))));//2016-04-01
var_dump(date("Y-m-d", strtotime("last day of +1 month", strtotime($cur_date))));//2016-04-30


最後測試一下跨年是否有影響。
結果:跨年度的話,似乎「年」能先準確的計算出來。至於最後會不會自動偏移,一樣是看該「年-月」是否有該日期決定。
$cur_date = "2017-03-29";
var_dump(date("Y-m-d", strtotime("-13 month", strtotime($cur_date))));//2017-02-29

$cur_date = "2017-03-30";
var_dump(date("Y-m-d", strtotime("-13 month", strtotime($cur_date))));//2016-03-01
var_dump(date("Y-m-d", strtotime("first day of -13 month", strtotime($cur_date))));//2016-02-01
var_dump(date("Y-m-d", strtotime("last day of -13 month", strtotime($cur_date))));//2016-02-29


參考:
令人困惑的strtotime | 风雪之隅


沒有留言:

張貼留言