strtotime()でmonth処理の注意点
starftimeで-1 month:はるみんち【PHP TIPS】 6. strtotimeの落とし穴
上記の記事にあるように、strtotime()でmonthの足し引きを行いまんまと落とし穴にはまってしまいました。
いわゆる西向く士(2,4,6,9,11)月がらみの落とし穴です。
2006-03-31から先月末日を取得せよ
[失敗例]$timestamp = strtotime('2006-03-31 -1 month'); echo date('Y-m-t', $timestamp);
[成功例]
$timestamp = strtotime('2006-03-31'); $now = date('Y-m-01',$timestamp); $timestamp = strtotime($now.' -1 month'); echo date('Y-m-t', $timestamp);
考察
冷静に考えれば、strtotime()は忠実に仕事をしています。'2006-03-31' -1 month = '2006-02-31'
'2006-02-31' = '2006-03-03'
ということで、2006-03-03の月の日数は31日で全く持って正しい。
落とし穴は「month(s)」です。
31日という日付部分をすっかり忘れて、てっきり先月と錯覚してしまいます。
例では'Y-m-01'と1日を指定していますが、1日~28日であればなんでもよいわけです。
このあまりに使い勝手のよいstrtotime()だからこその落とし穴のように感じます。
