質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

3478閲覧

今日の日付から一ヶ月後の日付を見た際に、一ヶ月の間に入らなかった日付を求める方法

bonobo

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/06/15 14:26

編集2018/06/17 02:46

前提・実現したいこと

 ①今日の日付から1ヶ月後の日付までの範囲を予約できるプログラムを組みました。
例:今日2/10→3/10まで予約可能

②また今日が月末日の場合、1ヶ月後はその月の末日を設定するようになっています。
例:今日が2/28→3/31までの範囲で予約可能
例:今日が8/31→9/30までの範囲で予約可能

②の場合、例えば2/28→3/31までの範囲で予約可能になりますが、本来1ヶ月の範囲であれば3/28までが予約可能範囲になりますが
仕様で「今日が月末日なら1ヶ月後の日付はその月の月末日を設定する」ようになっています。
その場合、2/28の一ヶ月後の範囲として3/29、3/30を巻き込んで3/31まで予約可能になってしまいます。

やりたいこととしては
今日の日付が末日かつ、[今月の月末日]<[一ヶ月後の月末日]の場合に一ヶ月の範囲として巻き込まれた日付を見たいです。
例:2/28の場合3/28,3/29,3/30を算出したい
4/30の場合5/30を算出したい

該当のソースコード

PHP

1 //今日の日付 2 $data->today = date("Y-m-d"); 3 4 //正確に〇ヶ月後の日付を求めるために、月初めに戻す 5 $data->firstDay= date("Y-m-1", strtotime($data->today)); 6 7 //今月の末日を取得 8 $data->lastDay = date('Y-m-t'); 9 10 //〇ヶ月後の日付 11 $data->qDateTo = date("Y-m-d",strtotime("+".$this->rsvConf->monthLimit." month" ,strtotime($data->today))); 12 13 //〇ヶ月後の末日 14 $data->qLastDay = date("Y-m-t",strtotime("+".$this->rsvConf->monthLimit." month" ,strtotime($data->firstDay))); 15 16 17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/15 22:45

何を言っているのかわからないのは多分、日本語がおかしいからなんだよね…。
退会済みユーザー

退会済みユーザー

2018/06/15 22:46

1ヶ月後に入らなかった分(3/29,3/30) ってさ、
退会済みユーザー

退会済みユーザー

2018/06/15 22:46

今日が2/28だったら1ヶ月という単位の定義は3/28までって言いたいのかな?
退会済みユーザー

退会済みユーザー

2018/06/15 22:47

で、そこから翌月の本当の末まで余分にある日付が(3/29,3/30)ってことかな?
退会済みユーザー

退会済みユーザー

2018/06/15 22:49

仕様が全くわからん…。
bonobo

2018/06/16 04:11

知りたいことは今日の日付が末日かつ、[今月の月末日]<[一ヶ月後の月末日]の場合に一ヶ月の範囲として巻き込まれた日付を見るにはどうしたらいいかということです。
退会済みユーザー

退会済みユーザー

2018/06/16 04:16 編集

だから、日本語おかしいって。「一ヶ月の範囲として“巻き込まれた”日付」ってなんだよ。何を求めてるかはわかったけど、どうしてそんな表現になっちゃうの?ってのが気になって仕方ない。
bonobo

2018/06/16 04:28

すいません、表現の仕方がわからなかったので。どう表現すればよかったでしょうか。
退会済みユーザー

退会済みユーザー

2018/06/16 04:45

形容するからおかしなことになるんだよ。
退会済みユーザー

退会済みユーザー

2018/06/16 04:48

質問文全体を編集しちゃってるから、またわけわからんことになってきてるけど
退会済みユーザー

退会済みユーザー

2018/06/16 04:48

検査日が月末なら、翌月の末日まで予約できる。で、「翌月/本日検査日付」 と 「月末」の間の日付がしりたかったんでしょ?
退会済みユーザー

退会済みユーザー

2018/06/16 04:49

したら、抽象的に書くと
a_saitoh

2018/06/16 04:49

「仕様で「今日が月末日なら1ヶ月後の日付はその月の月末日を設定する」ようになっています。」というのなら現状で仕様通りになっているわけで何の問題もないのではないですか?説明できないのなら具体例をいくつか挙げるのがいいかも。2/28とか4/30とか5/31の1ヶ月後として算出したい日は何日なんでしょう?
退会済みユーザー

退会済みユーザー

2018/06/16 04:52 編集

date("next_month_today") < 求めたい日’s < date("next_month_last_day") って事なんじゃないの?
bonobo

2018/06/17 02:19 編集

算出したい日付の例を出すと今日が2/28→3/28,3/29,3/30を算出したい 今日が6/30→7/30を算出したいということになります
a_saitoh

2018/06/17 13:45

5月31日だと求める答えは「無し」でしょうか?
bonobo

2018/06/17 14:01

5/31の一ヶ月後の場合は6/30を見る仕様なので「無し」です
guest

回答2

0

ベストアンサー

  • 提示されたコードをベースに考えると↓のように考えることができます。

php

1 if($data->qDateTo < $data->qLastDay) 2 { 3 $month = date("m", strtotime($data->qDateTo)); 4 foreach (range(date("d", strtotime($data->qDateTo)), date("d", strtotime($data->qLastDay)) -1 ) as $diffday) { 5 echo $month."/".$diffday."\r\n"; 6 } 7 }

単に文字をechoしてますが、DateTimeなどにするのは容易でしょう。

  • ところで、上記をぱっと書いてみて、最初、+1/-1をつけていなかったら、03/28とか03/31とかもechoされました。そこで質問やコメントをおさらいしてみると

算出したいのは2/28の一ヶ月後の場合3/29と3/30

である(それが一貫性をもって述べられている)ということが分かりました。そして↑では+1とか-1を入れました。
そこで+1/-1を入れる前に思ったんですが、これって、2月の月末でしかおきませんよね?つまり、いわゆる小の月(30日までの月)で月末が基準となって、大の月(31日までの月)の月末が指されたとしても、元の月の月末日である30日は(2/28の28日に対応する3/28が除外されるように)除外され、指し先の月の月末日である31日は(3/31が除外されるように)除外されるわけで、2/28から大の月のパターンで大の月/29と大の月/30。他の小の月で、小の月/29。うるうどしでは29日が除外されて2/29から大の月で大の月/30のみ。
これって、基準日$data->todayが2月末日であるかのifと$data->qLastDayが何日であるかのifから求まりませんか?
(結局のところ、問題は"月末"ではなく"2月"の話ということなので、質問者さんがどういう問題をかかえて、何をやりたかったのか意図が全く分かりません)

投稿2018/06/16 12:56

編集2018/06/17 11:49
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bonobo

2018/06/17 02:28

すいません不備がありました。算出したいのは2/28の場合、3/28,3/29,3/30です。 ですので今日が4/30だった場合5/30,5/31を算出したいのでifの条件として[今月の月末日]<[一ヶ月後の月末日]になるかと思います。
papinianus

2018/06/17 11:51

安直ですが、+1を外したので、28日や30日もechoされると思います。
bonobo

2018/06/18 12:58

解決できました。本当にありがとうございます。
guest

0

こんなかんじかな

共通処理

$date = strtotime("2018-02-28"); // 適当なものを入れてください $day = date("d",$date) ;

1か月後

$lastDay = date("Y-m-d" ,strtotime("last day of this month",$date)); $nextMonthDay = date("Y-m-d" ,strtotime("$lastDay + $day days")); echo $nextMonthDay; // 2018-03-28

2か月後

$lastDay = date("Y-m-d" ,strtotime("last day of next month",$date)); $nextMonthDay = date("Y-m-d" ,strtotime("$lastDay + $day days")); echo $nextMonthDay;

投稿2018/06/16 04:32

編集2018/06/16 04:36
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/16 04:41

なんか最近、asahina、随分劣化してない? 疲れてんの?
退会済みユーザー

退会済みユーザー

2018/06/16 04:43

あーかもね・・・ 三足の草鞋・・
退会済みユーザー

退会済みユーザー

2018/06/16 04:46

休めよ。脳みそが資本だろ。
bonobo

2018/06/16 05:59

回答ありがとうございます。今出力内容が確認できる環境がないのでお聞きしますが、算出したいのは2/28の一ヶ月後の場合3/29と3/30ですがこれだと3/28が出力されませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問