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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

5416閲覧

phpで「第2月曜」など特定の日にちを取得したい

taiyo-2017

総合スコア49

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2019/05/24 03:00

編集2019/05/24 04:03

php、cakePHP3を使用して、「第2月曜」などの日にちを取得したいと思っています。

https://php-archive.net/php/n-week/
こちらのサイトを見て、日にちを取得できることが分かったのですが、
特定の1日だけでなく、範囲の中で該当する日にち全てを取得する場合に有効なロジック?や関数などはありますでしょうか?
アドバイス等いただければと思います。

例)期間:2018年1月1日~2050年7月25日 第2、第3火曜、木曜

今考えている方法

PHP

1$fromY = 2018; 2$fromM = 1; 3$fromD = 1; 4 5$toY = 2050; 6$toM = 7; 7$toD = 25; 8 9$week_array = [2, 3]; // 2週、3週 10$week_of_day_array = [2, 4]; // 火曜、木曜 11 12$dates = []; // 期間中の日にちを入れる配列 13 14for ($year = $fromY ; $year <= $toY; $year++) { 15 for ($month = 1 ; $month <=12 ; $month++) { 16 if ($year == $fromY && $month < $fromM) { continue; } 17 if ($year == $toY && $month > $toM) { break; } 18 19 $datetime = new DateTime(); 20 $datetime->setTimezone( new DateTimeZone('Asia/Tokyo') ); 21 22 //その月の始まりは何曜日か 23 $datetime->setDate($year, $month, 1); 24 $w = (int)$datetime->format('w'); 25 26  foreach ($week_of_day_array as $wday) { 27 //指定された曜日の最初の日 28 $first = ($wday - $w >= 0) ? 1 + $wday - $w : 1 + $wday - $w + 7; 29 30 foreach ($week_array as $week) { 31 //日にちを算出 32 $day = $first + ( 7 * ($week - 1) ); 33 $datetime->setDate($year, $month, $day); 34 35 $dates[] = $datetime->format('Y-m-d'); // 日にち格納 36 } 37 } 38 } 39} 40

追記

期間や曜日、週などは不定となっているので
・期間:2018年1月1日~2050年7月25日 第1、第3火曜、木曜、
・期間:2018年1月31日~2019年12月25日 第5木曜、
・期間:2018年1月1日~2019年1月1日 第3日曜、月曜
など、多くのものに対応できるようにしたいと考えています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じですかね

PHP

1<?PHP 2$start="2018-01-01"; 3$end ="2050-07-25"; 4 5$d_start =strtotime($start." first day of 0 month"); 6$d_end =strtotime($end." first day of 1 month"); 7 8$list=[]; 9$d=$d_start; 10while($d<$d_end){ 11 $list[]=date("Y-m-d",strtotime(date("Y-m-d",$d)." first tuesday of 0 month +1 week")); 12 $list[]=date("Y-m-d",strtotime(date("Y-m-d",$d)." first tuesday of 0 month +3 week")); 13 $list[]=date("Y-m-d",strtotime(date("Y-m-d",$d)." first thursday of 0 month +1 week")); 14 $list[]=date("Y-m-d",strtotime(date("Y-m-d",$d)." first thursday of 0 month +3 week")); 15 $d=strtotime(date("Y-m-d",$d)." + 1 month"); 16} 17sort($list); 18$list=array_filter($list,function($x) use($start,$end){ 19 return $x>=$start and $x<=$end; 20}); 21print_r($list); 22

追記

任意の曜日とn番目を指定

PHP

1$start="2018-01-01"; 2$end ="2050-07-25"; 3 4$d_start =strtotime($start." first day of 0 month"); 5$d_end =strtotime($end." first day of 1 month"); 6 7$target=[["monday",1],["tuesday",2],["thursday",3]]; 8//上記、第1月曜、第2火曜、第3木曜 9 10$list=[]; 11$d=$d_start; 12$c=0; 13while($d<$d_end){ 14 foreach($target as $val){ 15 $list[]=date("Y-m-d",strtotime(date("Y-m-d",$d).sprintf(" first %s of 0 month +%d week",$val[0],$val[1]-1))); 16 } 17 18 $d=strtotime(date("Y-m-d",$d)." + 1 month"); 19} 20sort($list); 21$list=array_filter($list,function($x) use($start,$end){ 22 return $x>=$start and $x<=$end; 23}); 24print_r($list);

第n週のx曜日

PHP

1$start="2019-01-01"; 2$end ="2019-12-31"; 3$d_start =strtotime($start." first day of 0 month"); 4$d_end =strtotime($end." first day of 1 month"); 5$day_of_week=["sunday","monday","tueday","wednesday","thuesday","friday","saturday"]; 6$target=[["sunday",6]]; 7$list=[]; 8$d=$d_start; 9$c=0; 10while($d<$d_end){ 11 $w=(date("w",$d)); 12 foreach($target as $val){ 13 $offset=array_search($val[0],$day_of_week)<$w?1:0; 14 $day=date("Y-m-d",strtotime(date("Y-m-d",$d).sprintf(" first %s of 0 month +%d week",$val[0],$val[1]-1-$offset))); 15 if(date("Y-m",$d)==substr($day,0,7)) $list[]=$day; 16 } 17 $d=strtotime(date("Y-m-d",$d)." + 1 month"); 18} 19sort($list); 20$list=array_filter($list,function($x) use($start,$end){ 21 return $x>=$start and $x<=$end; 22}); 23print_r($list);

上記で

PHP

1$start="2018-01-01"; 2$end ="2050-07-25"; 3$target=[["monday",1],["tuesday",2],["thursday",3]];

とすれば最初の命題にも合致すると思います

投稿2019/05/24 03:43

編集2019/05/27 01:19
yambejp

総合スコア114572

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

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

yambejp

2019/05/24 03:50 編集

考え方 ・$startの月初から$endの翌月の月初まで毎月1日を得る ・それぞれの月の第2、第4、火、木を得る ・ソートして ・$startから$endの範囲外の日付を削除する ただし、第5火曜日みたいなその月には存在しないような可能性が ある場合はもう少し工夫が必要
taiyo-2017

2019/05/24 04:07

回答ありがとうございます。 フィルタリングもできるのですね!初めて知りました。 ですが、追記に書かせていただきましたが、 火曜と木曜の特定の曜日だけでなく、いろいろな曜日、週を想定していたので、 上記以外にも考え方があれば教えていただければと思います。
yambejp

2019/05/24 04:22

任意の曜日とn番目を選べるようにしました。 ちなみにn番目のx曜日とn週目のx曜日は意味が違うので どちらを拾いたいかきっちり仕様をきめてください もしn週目のという場合は、週には日曜はじまりと月曜はじまりという 考え方があるのでそれも決め込む必要があります
taiyo-2017

2019/05/27 00:24

お返事が遅れましたが、「n週目のx曜日、日曜始まり」の想定です。 2019年1月1日~2019年12月31日までの期間で第6週の日曜日であれば 2019年3月31日(日) 2019年6月30日(日) を取得できるようにしたいと考えています。
yambejp

2019/05/27 00:26

つまり土曜が1日だった場合は第1日曜~金曜は前月の最終週をひろうのでしょうか?
taiyo-2017

2019/05/27 00:32 編集

いえ、その場合は拾わず、あくまで「第n週」のものを取得したいと考えています。 すみません「土曜が1日だった場合」という意味合いが理解できていないかもしれません。
yambejp

2019/05/27 00:37

1/1が土曜だったら第1金曜は12/31なのか1/6なのかnullなのかということ
taiyo-2017

2019/05/27 00:44

その場合は日付は取得せず「null」の扱いをしたいです。
yambejp

2019/05/27 01:20

上記offset処理をいれました
taiyo-2017

2019/05/27 02:34

日を取得することができました! 改めて、コードを順に追って理解していきたいと思います。 丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問