• ベストアンサー

strtotime 前月・前々月の表示

お世話になります。 strtotime を使って下記のように前月・前々月の表示をさせています ーーーーーーーーーーーーーーーー <?php for($i = -2 ; $i <= 0 ; $i++){ $year = date("Y",strtotime("$i month")); $month = date("m",strtotime("$i month")); print $year . "年" . $month . "月<br>"; } ?> ーーーーーーーーーーーーーーーー 7月31日にその表示をさせたら 2007年05月 2007年07月 2007年07月 と表示されてしまいました。 今月(8月)に入ってからは こちらの意図するとおりの表示に戻っていました 何か strtotime の使い方等間違っているのでしょうか? ご指導、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

詳しいことは分かりませんが、2007-07-31 の -1 month は 2007-07-01 のようです。 2007-06-31 は存在しないので 2007-07-01 になるんじゃないでしょうか。 月日を取得したいだけならmktimeが確実かと思います。 for ($i = -2 ; $i <= 0 ; $i++) { $time = mktime(0, 0, 0, date('m')+$i, 1, date('Y')); $year = date("Y", $time); $month = date("m", $time); print $year . "年" . $month . "月<br>"; }

futatu
質問者

お礼

ありがとうございます -1 monthは30日引いた日付と一緒なんですね それでいくとstrtotimeの使い道が狭まってしまいますね>< mktimeでの方法まで記述いただきありがとうございます そちらの方法で手直ししていきます ありがとうございました

その他の回答 (1)

  • eitetsu
  • ベストアンサー率64% (22/34)
回答No.2

仕様にそった動作ではないかと思います。 7/31から、-1Month とすると、6/31になりますが、実際にはそういう日付は存在しません。 Date関数はこういう存在しない日付の場合、実際の日付に換算しますので、6/31→7/1と変換した上で、フォーマットを適用したのだと思います。 #たぶん、前月が小の月で、当月が大の月の31日には、症状が再発するのではないでしょうか?(3,5,7,10,12月) 月までの表示でよいのであれば、当月の1日を基準とした動作をするように直せばよいと思います。 例えば  date("m", mktime(0, 0, 0, 1, date("m")-1, date("Y"))); といった様な表記であれば、問題ないかと思います。

futatu
質問者

お礼

回答ありがとうございます 仕様なんですね・・・ ある意味間違った使い方をしているのだと知りました mktimeを使って修正します ありがとうございました。

関連するQ&A