dポイントプレゼントキャンペーン実施中!

お世話になります。
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 の使い方等間違っているのでしょうか?
ご指導、宜しくお願い致します。

A 回答 (2件)

詳しいことは分かりませんが、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>";
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/01 23:43

仕様にそった動作ではないかと思います。



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")));
といった様な表記であれば、問題ないかと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/01 23:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!