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

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

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

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

Q&A

5回答

5630閲覧

[PHP]指定された日付が 今月・来月・再来月の範囲か調べたい

pac894398

総合スコア429

PHP

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

0グッド

0クリップ

投稿2017/03/29 04:08

やりたいことは 題名の通りです。
例えば 本日 3/29に実行したら 与えられた日付が 3/1 ~ 5/31 の間に取得したいということです。

以下のコードを書きましたが 12月など年が変わると使えません...。

php

1if(date('Ym', strtotime($time)-1 < date('Ym', strtotime($time)) && date('Ym', strtotime($time)+3 > date('Ym', strtotime($time))){ 2//true 3}else{ 4//false 5}

分岐しまくってもいいのですが 何か良い方法はありませんでしょうか?
ご回答よろしくお願いいたします。

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

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

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

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

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

guest

回答5

0

php

1$t = strtotime($time); 2$month = date('n', $t); 3$year = date('Y', $t); 4if (mktime(0, 0, 0, $month , 1, $year) <= $t && // 当月の1日以上 5 mktime(0, 0, 0, $month + 3, 1, $year) > $t) { // 翌々々月の1日未満(つまり再来月末23:59:59以下) 6 // true 7} 8else { 9 // false 10} 11```こんな感じ? 12`mktime`は15月とか34日とかを受け入れるので便利ですよ。

投稿2017/03/29 04:17

編集2017/03/29 05:36
shi_ue

総合スコア4437

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

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

shi_ue

2017/03/29 05:37 編集

$timeは文字でしたね。修正しました。
guest

0

順番に考えます。
0. 本日の日付(date1)を取ります
0. date1から、本日を含む月の初日(1日。date2)を作ります
0. date2の3ヶ月後の前日(=2ヶ月後の末日。date3)を作ります

Date2とDate3で範囲が定まりますね。
あとはこれを実際に組んでみましょう。

PHP

1<?php 2$date1 = new DateTime(); 3$date2 = new DateTime($date1->format('Y-m').'-01'); 4$date3 = new DateTime($date2->format('Y-m-d'); 5$date3->add(new DateInterval('P3M')); 6$date3->sub(new DateInterval('P1D')); 7 8echo $date1->format('Y-m-d') . "\n"; 9echo $date2->format('Y-m-d') . "\n"; 10echo $date3->format('Y-m-d') . "\n"; 11?>

実行するとこうなりますから、今月(の初日)~再来月(の最終日)がうまく処理できます。

2017-03-29

2017-03-01
2017-05-31

投稿2017/03/29 04:32

tacsheaven

総合スコア13703

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

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

0

php

1<?php 2 3/** 4 * 今月・来月・再来月を判定する 5 * @param string $date yyyy-mm-dd 6 */ 7function check_month($date) 8{ 9 $now = new DateTime(); 10 $now_month = $now->format('Y') * 12 + $now->format('n'); 11 $dt = new DateTime($date); 12 $dt_month = $dt->format('Y') * 12 + $dt->format('n'); 13 14 $diff = $dt_month - $now_month; 15 return (boolean) (0 <= $diff && $diff < 3); 16} 17 18var_dump(check_month('2017-02-18')); // false 19var_dump(check_month('2017-03-18')); // true 20var_dump(check_month('2017-04-18')); // true 21var_dump(check_month('2017-05-18')); // true 22var_dump(check_month('2017-06-18')); // false 23

投稿2017/03/29 16:37

編集2017/03/29 16:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

う~ん、どうも野暮ったい…。

PHP

1$d = '2017-03-01'; // 比較対象日付 2$dd = new DateTime($d); 3 4$now = new DateTime(); // 当日 5$m1 = new DateTime($now->format('Y-n-1')); // 当月の1日 6$m3 = new DateTime($m1->format('Y-n-d')); 7$m3->add(new DateInterval('P3M')); // 当月の3か月先 8 9// タイムスタンプで比較 10if($m1->getTimestamp() <= $dd->getTimestamp() && $dd->getTimestamp() < $m3->getTimestamp()){ 11 echo true; 12} else { 13 echo false; 14} 15

投稿2017/03/29 05:01

ttyp03

総合スコア16998

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

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

0

下記の様な取り方もできると思います。

PHP

1$startDate = date('Y-m-d', strtotime('first day of ' . date('Y-m-d')));//当月始め 2$endDate = date('Y-m-d', strtotime('last day of '.date('Y-m-d',strtotime($startDate. ' 2 month'))));//翌々月末 3$targetDate = '2017-06-01';//比較対象日付 4if($startDate <= $targetDate && $targetDate <= $endDate){ 5 echo '範囲内'; 6} else { 7 echo '範囲外'; 8}

投稿2017/03/29 06:35

編集2017/03/29 06:38
motuo

総合スコア3027

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問