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

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

ただいまの
回答率

90.86%

  • PHP

    18594questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 245

bonobo

score 1

 前提・実現したいこと

①今日の日付から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を算出したい

 該当のソースコード

        //今日の日付
        $data->today = date("Y-m-d");

        //正確に〇ヶ月後の日付を求めるために、月初めに戻す
        $data->firstDay= date("Y-m-1", strtotime($data->today));

        //今月の末日を取得
        $data->lastDay = date('Y-m-t');

        //〇ヶ月後の日付
        $data->qDateTo = date("Y-m-d",strtotime("+".$this->rsvConf->monthLimit." month" ,strtotime($data->today)));

        //〇ヶ月後の末日
        $data->qLastDay = date("Y-m-t",strtotime("+".$this->rsvConf->monthLimit." month" ,strtotime($data->firstDay)));
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • bonobo

    2018/06/17 11:19 編集

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

    キャンセル

  • a_saitoh

    2018/06/17 22:45

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

    キャンセル

  • bonobo

    2018/06/17 23:01

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

    キャンセル

回答 2

checkベストアンサー

0

  • 提示されたコードをベースに考えると↓のように考えることができます。
        if($data->qDateTo < $data->qLastDay)
        {
            $month = date("m", strtotime($data->qDateTo));
            foreach (range(date("d", strtotime($data->qDateTo)), date("d", strtotime($data->qLastDay)) -1 ) as $diffday) {
                echo $month."/".$diffday."\r\n";
            }
        }


単に文字を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/17 11:28

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

    キャンセル

  • 2018/06/17 20:51

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

    キャンセル

  • 2018/06/18 21:58

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

    キャンセル

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 13:41

    なんか最近、asahina、随分劣化してない? 疲れてんの?

    キャンセル

  • 2018/06/16 13:43

    あーかもね・・・ 三足の草鞋・・

    キャンセル

  • 2018/06/16 13:46

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

    キャンセル

  • 2018/06/16 14:59

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

    キャンセル

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

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    今月と来月のカレンダーの処理をfor文で回すには

    初心者です。下記for文を書いてみたのですが、当月は出来ても翌月のはできませんでした。 どなたか教えて頂けますでしょうか。 $tsuki = '月'; $list

  • 解決済

    data型の時間加算がうまくいかない

    直接日付しているものはちゃんと24時間後が表示されて、 DBから取得したものに時間加算してもうまく反映されないのですが、 何が原因なのでしょうか? $dsn = 'mys

  • 解決済

    PHPでの日付計算処理

    PHPであるサイトから日付を抽出しています。 $date = []; if ($node->Filter('tr')) { for ($i = 1; $i < $c;

  • 解決済

    phpで月ごとに画像の切り替えを行いたい

    非常に初歩的な質問で恐縮ですが、タイトルには月ごとと書きましたが、とりあえず11月用の画像を表示して11月が終わったら12月用の画像を表示したいと思っております。 実際に書い

  • 解決済

    php 配列にデータ挿入する時の動作

    phpにて //test01 = 定数です。 //日付 2017/01/19 $whereData = array(); $whereData[] = data('Y',st

  • 解決済

    Fuelphp プルダウンを年月で作成したい

    fuelphp:1.7.0にて プルダウンを作成したいのですが 条件が 開始年月が2017/06 終了範囲が現在の年月(現在なら2017/08) のような自動で毎月プルダウ

  • 解決済

    datetimeの型か否かを調べる関数

    取得した時間の値が、Y-m-d H:i:sになっているかどうかを判定するPHPの関数ってありますか? preg_matchで調べるしかないですか?

  • 解決済

    GETのstr_replace変換について

    別スレのカウント処理について参考にやってみましたが、別問題に突き当たり解決方法が思い当たらないので再度失礼します。 https://teratail.com/questions/1

同じタグがついた質問を見る

  • PHP

    18594questions

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

  • トップ
  • PHPに関する質問
  • 今日の日付から一ヶ月後の日付を見た際に、一ヶ月の間に入らなかった日付を求める方法