• 締切済み

PHPでの日数の求め方

PHPで日数を求める処理を作りたいのですが 検索して同じ様な質問をもとに下記のように作成したのですがうまくいきません。 教えてください。 登録処理日(本日)が予約日の10日以上前なら「仮予約」を 登録処理日(本日)が予約日の10日以内なら「本予約」を表示したい 但し、11月1日から11月10日の日数は10日とする考え方で日数を求めたいのです。 登録処理日($tourokuday)が11月21日の場合 予約日($yoyakudate)が11月30日は「本予約」 予約日($yoyakudate)が12月1日は「仮予約」と表示したいのですが $tourokuday=strtotime(date("Y-m-d")); if(strtotime($yoyakudate) - $tourokuday <= 10*24*60*60) { printf("本予約です"); } else { printf("仮予約です"); } 上記で処理を行うと両日とも「本予約」と表示されます プラス1日を加えればいいと思いますがどのようにしたらいいのかわかりません。 質問が解りずらいかもしれませんが宜しくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

対処としては #3の方のものだと思うんですが、要するにありがちな off-by-oneエラーじゃないですか? strtotimeが返すのが unixtime (エポックからの経過秒数)だとすると、 11/21 00:00 → 1164034800 11/30 00:00 → 1164812400 12/1 00:00 → 1164898800 で、12/1 - 11/21 は 864000 です(24*60*60*10)。 一方で 11/10 - 11/1 は 777600 (24*60*60*9)です。 後者の例で11/10を丸々含むことを考えれば、翌日の午前零時を 基準にしてその直前までという形で比較を行うべきだと思います。 暦の切り替えをまたいだりエポックを越えたりするわけではないので、 ユリウス日を持ち出すまでもないと思います。

morizoukun
質問者

お礼

ご丁寧に説明までありがとうございます。 とても参考になりました。

回答No.3

if文の中の <= が < になるだけではないですか?

morizoukun
質問者

お礼

ありがとうございます。 こちらの方法で試しても同じ結果がでました。 問題解決しました。

回答No.2

これにはいろんな解があると思いますが、私なら悩まずに2行目を下記のようにします。 if(strtotime($yoyakudate) - $tourokuday <= 9*24*60*60) {

morizoukun
質問者

お礼

ありがとうございます。 問題が解決しました。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 日付の計算をされたいのであれば、一度「ユリウス日」に変換してから計算や比較をなさると簡単に出来ます。 PHPでのユリウス日の変換方法は… http://www.google.co.jp/search?hs=4oh&hl=ja&c2coff=1&client=firefox&rls=org.mozilla%3Aja%3Aofficial&q=%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5+PHP&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja あたりをご覧になってみてください。

morizoukun
質問者

お礼

ありがとうございます。 今後の参考にしたいと思います。

関連するQ&A

専門家に質問してみよう