• 締切済み

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

  • 先月の日数を求める関数にうるう年を適応するかどうか

    お世話になります。 今年2月はうるう年ではありませんが下記のPHP関数において、 ■指定した月の日数 <?php echo date('t', strtotime('-1 month')); ?> これは、表示させると先月((month-1)月)の日数「31」を吐き出すのですが、 この関数にはうるう年処理は設定されているのでしょうか? もしPHP5にこの処理がなければ自分でうるう年処理を作成しようとしております。 ご返事お待ちしております。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 日数を計算する方法

    以下のようにして変数の配列を使って、 月の日数を格納しています。 int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31}; これを使って、 元旦から入力された月日の日数を計算したいのですが どの様にすればいいですか? 例えば、 4月5日の場合は、 1月 31日 2月 28日 3月 31日 4月 5日 なので「95日」 ---------------- 途中までのプログラム #include<stdio.h> main(void) { int yy, mm, dd; int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31}; printf( "西暦を入力しなさい" ); scanf( "%d", &yy ); printf( "月を入力しなさい" ); scanf( "%d", &mm ); printf( "日を入力しなさい" ); scanf( "%d", &dd ); /* うるう年判定 */ if (((yy%4==0)&&(yy%100!=0))||(yy%400==0)) mon[1]=29; else mon[1]=28; ・ ・

  • 人生を日数にするとおよそ28,855日長いですか?

    人生を日数にするとおよそ28,855日長いですか? (仮に日本人男性の平均寿命が79歳として) 人間って日にち換算すると3万日も生きないのですね。 私は、ちょっと短い気もしています。 一日一日を大切に、丁寧に生きなくちゃと思いました。 長いと感じますか?短いと感じますか? 注意:批評・批難・中傷・質問に対する質問はご遠慮下さい。

  • 近鉄定期1ヶ月の日数計算について

    近鉄定期の1ヶ月の見方があれば教えてください。 ひと月30日や31日、2月だと28日という日数の違いがあると思います。 1ヶ月定期として購入した場合、その辺りはどのように処理されるのでしょうか。 私が思い浮かべるのは A)単純に日にち通りで 2月2日開始~3月1日まで B)基準日数が設定されていて30日なら 2月2日開始~3月3日まで この辺りなのですが… ご存知の方がいらっしゃいましたら教えてください。 2月14日から1ヶ月定期を購入予定です。 もしAの方法で処理されるなら3月1日から購入した方がおとくかも…と悩んでいます。 よろしくお願いします。

  • shtmlファイルでのif文

    質問させていただきます。 htmlファイルへの埋め込みだとうまくいくのですが、 shtmlファイルへ下記スクリプトを埋め込むと、 『あかさたな!")); break; } else { printf(""); break; } } ?> 』 とスクリプトの部分まで表示されてしまいます。 この消し方(『あかさたな』とだけ表示させたい)をご存知の方、 お教えください。 <? $dir = opendir("./aaa/bbb/ccc"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filectime("./aaa/bbb/ccc/$fnm"); $nowdate =strtotime(date("Y-m-d")); if(strtotime($nowdate) - $ftime <= 7*24*60*60) { printf("<FONT size="2"><B>あかさたな</B></FONT>"); break; } else { printf(""); break; } } ?>

    • ベストアンサー
    • PHP
  • 日数を求める計算方法について

    日数を求める計算方法について A1:開始日入力、B1:終了日を入力しました。 単純にB1-A1にした結果の日数が開始日か終了日のどちらかが含まれず1日少ない日数です。 やり方が違うのでしょうかカウントの基本も合わせて教えて下さい。 開始日も終了日も両方カウントされるものだと理解してます。これ違いますか? 年/月/日で表示させています。

  • 稼働日数について質問します。月平均稼働日数は、4月1日~3月31日と1

    稼働日数について質問します。月平均稼働日数は、4月1日~3月31日と1月1日~12月31日のどちらを基準に数えればいいのでしょうか。それとも毎月稼働日数を数えた方がいいのでしょうか?前に、社労士さんに、1年の稼働日数を12か月で割った方が良いとアドバイスを受けた事もありましたが、以前に比べ、祝祭日が多くなり毎月の変動が大きくなったような気がします。実際のところ皆さんはどのようにしているのでしょうか。宜しくお願いいたします。

  • この年間休日日数ってやはり少ないでしょうか?

    昨日ハローワークである求人を見つけまして早速本日面接の予約をとりました。しかし一つ気になっている事があります。それは年間休日日数が87日なんです。私としてはプライベートの時間も大切にしたいほうなんであまりに休日が少ない会社は合いません。せめて隔週休土曜日は確保したいところです。 職安の職員の方にも言われたんですがこの日数ではおそらく隔週休土曜日ではなく月一回土曜日休みがあるかないかといったところでしょうねと指摘されました。自分としてはこの点が大変ひっかかってて昨日からすごく悩んでいて今日の面接辞退しようかどうか悩んでます。 やはりこの休日日数だと隔週休土曜日ものぞめない状況でしょうか? ぜひご助言願います!

  • 西暦・月からカレンダーを表示

    問題文 西暦・月を入力してカレンダーを表示するプログラムを作成せよ。 プログラム全体のことを考える。プログラムの流れとしては、つぎのようになるであろう。  (1)変数の宣言: プログラムの中で使う変数や配列等をすべてここに集めておく。          (2)入力: キーボードから、西暦年の値を読み取る ← scanf( ) 関数  1月から12月まで、以下を繰り返す。  (3)カレンダーの年・月の表示: (例えば、2008年1月 と表示)  (4)各曜日名の表示: 「日 月 火 水 木 金 土」と表示  (5)月の日数の算出: 月の最後の日を計算しておく。(*1~12月以外では誤りとすること)  (6)曜日の算出: 月の初めの日(ついたち)の曜日をツェラー公式で計算しておく。  (7)空列の表示: ついたちの前の空白部分を表示する ← for文 を利用。  (8)各日の表示: 月の各日を順に表示していく ← for文を利用          (土曜の後に改行を入れる) #include <stdio.h> int leapYear(int year) { if (year%400==0||(year%4==0 && year%100!=0)) { return 1; } else { return 0; } } int main(void) { int d,year,m,i; int day[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; /*1~12月までの各月の日数*/ printf("西暦を入力してください:"); scanf("%d",&year); printf("月を入力してください:"); scanf("%d",&m); if(m!=1 & m!=2 & m!=3 & m!=4 & m!=5 & m!=6 & m!=7 & m!=8 & m!=9 & m!=10 & m!=11 & m!=12)/*1~12月以外で日数を出そうとした場合*/ { printf("入力が誤っています。やりなおしてください。\n"); } else{ if (leapYear(year)==1)/*閏年の場合*/ { printf("%d年は閏年です。\n",year); day[1] +=1; } else/*閏年でない場合*/ { printf("%d年は閏年ではありません。\n",year); } i = (year+year/4 -year/100 +year/400 + ( 13*m+8 )/5 + 1) % 7; /*西暦~年・1~12月の1日の曜日について考える*/ printf("日 月 火 水 木 金 土\n"); (7)・・・ (8)・・・ } return 0; } 手順に沿ってやっていく課題なのですが(7)、(8)の部分の表現の仕方が良く分かりません。(求めた月の日数をカレンダー形式に表示する方法・1日の前に空白を入れる等) 過去の質問も見たのですが、いまいち理解できず・・・orz どなたかご教授お願いできないでしょうか・・・。

  • (C言語)西暦年月日を入力して、その日の曜日を表示させるプログラムを試したのですが…

    西暦年月日を入力して、その日の曜日を表示させるプログラムを作りたいのですが、とりあえず、やってみましたが… int main(void) { int i,y,m,d,dy,dw; int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; printf("Year?"); scanf("%d",&y); printf("Month?"); scanf("%d",&m); printf("Day?"); scanf("%d",&d); for(i=0;i<=m-1;i++){ dy = d + D[i] ; } if(m>=3){ if(y % 4 == 0){ if(y % 400 == 0){ dy = dy + 1 ; } else if(y % 100 ==0){ dy = dy ; } else{ dy = dy + 1 ; } } else if(y % 4 == 1 || y % 4 == 2 || y % 4 == 3 ){ dy = dy ; } } dw = (dy -1 + ( y + ( y - 1 )/4 - ( y - 1 )/100 + ( y - 1 )/400))%7 ; if (dw == 0) printf("Sunday\n"); else if (dw == 1) printf("Monday\n"); else if (dw == 2) printf("Tuesday\n"); else if (dw == 3) printf("Wednesday\n"); else if (dw == 4) printf("Thursday\n"); else if (dw == 5) printf("Friday\n"); else if (dw == 6) printf("Saturday\n"); return 0 ; } このプログラムを各年の1月1日~2月28日で試してみると、うまくいくのですが、3月1日に入るとなぜかうまく働いてくれません。(ちなみに2005年の11月では偶然うまくいっています。)その理由が分からないのでどなたか教えてください。ちなみに、この一連のプログラムを行うにはもっと簡単に行える関数というかコマンド?みたいなものがあるようですが、基本的に各年の1月1日を、 (y+(y-1)/4-(y-1)/100+(y-1)/400)%7で(0:Sunday~)、同年の○月○日は1月1日から△日経過しているという考え方で、曜日を割り出すプログラムにしなければならないといけないので、注文が多いですがよろしくお願いします。