PHP strtotime バグへの対処

coldplay.xixi
coldplay.xixi転載
2020-06-08 10:26:043848ブラウズ

PHP strtotime バグへの対処

PHP strtotime バグ処理

最近使用した strtotime と -1 month、1 month、next month を組み合わせて前月または来月を取得します月の日付ですが、記事を見て、strtotime を使用して日付を直接取得するのはまだ少しバグがあることに気付きました。

BUG

たとえば、date :

$today = '2020-12-31';
echo date("Y-m-d",strtotime("$today -1 month"))

出力

2020-12-01

上記の出力からわかるように、出力はまだ 2020 年 12 月です

分析:

最初の月に -1 を実行すると、現在の月は 07-31 になり、1 を引くと 06-31 になります。

6 月には 31 日がないため、日付の正規化を再度実行します。 2:60 は、6 月 31 日の 3:00 に相当します。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

解決策

PHP5 から。3 以降、date には、この問題を明確にするための一連の修正フレーズ、つまり「first day of」と「last day of」が追加されました。これは、日付を制限できることを意味します。

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

5.3 より前のバージョンの場合は、mktime などを使用してすべての日を無視できます。たとえば、日付を次のように制限します。毎月 1 日ですが、最初の日を直接使用することをお勧めします。よりエレガントです。

推奨チュートリアル: "PHP ビデオ チュートリアル "

以上がPHP strtotime バグへの対処の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はliqingbo.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。