• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:10月31日の翌月は11月ではなく12月となる)

翌月の取得処理における不具合

このQ&Aのポイント
  • 10月31日の翌月は11月ではなく12月となることが不具合として発生しています。
  • プログラムの処理により、本日動作したログの結果が誤って2014-12-01となり、本来の2014-11-01が取得されていません。
  • 現在の処理では、15日以上の場合は次月の1日、14日未満の場合は当月の1日を返すようになっています。修正する方法が必要です。

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5252/13737)
回答No.2

return date('Y-m-01', strtotime('+1 month', strtotime(date('Y-m-01')))); って感じですかね。 strtotimeの昔からあるバグ(仕様)が原因です。 10月31日の1ヵ月後は11月31日と計算してしまいます。(月を加算しているだけ) 11月31日は存在しない日付なので、11月30日の次の日という基準で結果が求められて12月1日と返してきます。 2月とかも面倒くさい事になるので、慣れた人は今月1日の1ヵ月後という計算をさせます。

Kamen_Ride
質問者

お礼

すごいです!ずばり求めていた解答です! 本当にありがとうございます。 これに置換すれば、本日の処理に間に合いそうなので助かります。 あとは、、、 プログラム内で、同様な文法が複数あるので、 +1 month や +2 month 等 正規表現にて一発置換する方法を考えなくてはいけません(泣)

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

mktimeで処理してみては? function hoge() { $d=mktime(); //$d=mktime(0,0,0,10,31,2014); if(date('d',$d) >= 15){ return date('Y-m-d', mktime(0,0,0,date('m',$d)+1,1,date('Y',$d))); }else{ return date('Y-m-d', mktime(0,0,0,date('m',$d),1,date('Y',$d))); } } echo hoge();

Kamen_Ride
質問者

お礼

おお!mktimeですか テストしてみましたが、翌年もちゃんと計算されますし、 なにより、解りやすいです。 ただし、↓だと、一括置換すると、一行が長くなってしまい、 「return date('Y-m-d', mktime(0,0,0,date('m',mktime())+1,1,date('Y',mktime())));」 コーディング規約に触れそうなので、↓でいこうと思います。 「return date('Y-m-01', strtotime('+1 month', strtotime(date('Y-m-01'))));」 ありがとうございました!

  • kawais070
  • ベストアンサー率52% (2242/4283)
回答No.1

+1 month は、31日加算と同じ意味なので、11月のように、31に満たない月では誤作動します。 http://qiita.com/HamaTech/items/20b37b614ef84fb3197c 上記を参考に、月末の翌日という計算をすれば良いはず。詳細は自分で調べてね。

Kamen_Ride
質問者

お礼

なるほど!+31日しているのですか! それであれば、確かに12月になりますね! 回答ありがとうございます!!

関連するQ&A

専門家に質問してみよう