やりたいことは 題名の通りです。
例えば 本日 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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア4437
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
総合スコア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
総合スコア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総合スコア3027
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/29 05:37 編集