PHP strtotimeのBUG処理

1675 ワード

BUGは日付:
$today = '2020-12-31';
echo date("Y-m-d",strtotime("$today -1 month"))
  
2020-12-01

上の出力から分かるように、出力は2020年12月の分析です:まず-1 monthをして、それでは現在は07-31で、1を減らしてから06-31です.さらに日付を正規化すると、6月に31日がないので、2時60分が3時になるように、6月31分が7月1になるのは論理的に「はっきりしている」のではないでしょうか.2つ目のステップを手動で検証することもできます.たとえば、次のようにします.
var_dump(date("Y-m-d", strtotime("2020-12-31")));
//   2020-12-01

つまり、大小の月の最終日にかかわる限り、この迷いがある可能性があります.私たちも似たような他の月を簡単に検証することができます.この結論を証明することができます.
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2020-12-31"))));
//   2020-12-03

var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2020-08-31"))));
//   2020-10-01

var_dump(date("Y-m-d", strtotime("next month", strtotime("2020-01-31"))));
//   2020-03-03

var_dump(date("Y-m-d", strtotime("last month", strtotime("2020-03-31"))));
//   2020-03-03

ソリューションはPHP 5.3から、dateは一連の修正フレーズを追加して、この問題を明確にしました.それは「first day of」と「last day of」です.つまり、dateを自動的に「規範化」しないように制限することができます.
var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2020-03-31"))));
//  2020-02-28

var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2020-08-31"))));
//  2020-09-01

var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2020-01-31"))));
//  2020-02-01

var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2020-03-31"))));
//  2020-02-28