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

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

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

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

Q&A

解決済

2回答

185閲覧

時間の差分を求めたい(PHP)

kenkbou

総合スコア151

PHP

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

1グッド

0クリップ

投稿2019/03/06 13:11

お世話になります。

文章だと難しいのですが、

例えば、2019年3月1日 10:00〜19:00の時間に対して

下記日時を埋めた時間配列を求めたいと思っています。
2019年3月1日 11:00〜12:00
2019年3月1日 15:15〜16:15
2019年3月1日 18:45〜19:45

出力としては

2019年3月1日 10:00〜11:00
2019年3月1日 12:00〜15:15
2019年3月1日 16:15〜18:45

を出したいと思っております。

何か良い方法は無いでしょうか。

分単位の配列にしないといけないでしょうか。

教えていただけますと幸いです。

bochan2👍を押しています

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

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

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

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

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

kei344

2019/03/06 14:29

ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。https://teratail.com/help/question-tips
guest

回答2

0

年月日時刻の計算って、思った以上にややこしいですよね。

週カレンダーをベースとした、面談予約の仕組みを作成したことがあります。既に埋まった時間枠はグレーアウトして予約が入れられない、という感じでした。

似て非なるものかもしれませんが、たぶん、3月1日の例だけではなく、カレンダーも絡むのでは?、と思いました。

開始年月日時刻、終了年月日時刻をstrtotime(秒単位)で決め打ち(週カレンダーなら日曜10:00から土曜19:00とか)して、whileで1日ずつ回して、さらにその中でwhileで分単位(5分ごととか10分ごととか)で回し、さらにその中でif条件で配列を作成していく方法しか思い付きませんです。

$start = strtotime($start); $end = strtotime($end); while($start <= $end) { $tstart = strtotime(date('Y-m-d', $start)." 10:00"); $tend = strtotime(date('Y-m-d', $start)." 19:00"); while($tstart <= $tend) { // ここに必要条件、除外条件を書いて、必要な配列を組成する。 $tstart = $tstart + 300; // 5分(300秒)ずつ進める } $start = strtotime("+1 day", $start); }

参考になれば幸いです。

投稿2019/03/06 14:49

編集2019/03/07 02:47
SaintKnowledge

総合スコア368

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

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

kenkbou

2019/03/07 02:38

ありがとうございます、コメントが消えてしまっていました。 1分ごとだとすごいメモリを消費してしまいそうですね、、 試してみます
guest

0

ベストアンサー

「2019年3月1日 11:00〜12:00」を年月日、開始時間、終了時間に分け、配列に格納してみました。
11:00は1100という数値として扱っております。

php

1function get_vacancy($start = 1000, $end = 1900, $booked = []) 2{ 3 $result = []; 4 5 foreach ($booked as $row) 6 { 7 if ($start < $row[0]) 8 { 9 $a = $start; 10 11 if ($row[0] < $end) 12 { 13 $b = $row[0]; 14 } 15 else 16 { 17 $b = $end; 18 } 19 $result[] = [$a, $b]; 20 } 21 22 if ($start < $row[1]) 23 { 24 $start = $row[1]; 25 } 26 } 27 28 if ($start < $end) 29 { 30 $result[] = [$start, $end]; 31 } 32 33 return $result; 34} 35 36// $taken: 埋まっている時間帯を配列に格納 37$taken = [ 38 '2019-03-01' => [ [1100, 1200], [1515, 1615], [1845, 1945] ], 39 '2019-03-02' => [ [1000, 1100], [1115, 1145], [1500, 1630] ], 40 '2019-03-03' => [ ], 41 '2019-03-04' => [ [900, 1100], [1115, 1145], [1500, 1930] ], 42 '2019-03-05' => [ [900, 1100], [1045, 1145], [1500, 1630], [1615, 1715] ] 43]; 44 45// $vacancies: 空き時間帯の配列 46$vacancies = []; 47 48foreach ($taken as $date => $times) 49{ 50 $vacancy = get_vacancy(1000, 1900, $times); 51 $vacancies[$date] = $vacancy; 52} 53 54 55// 以下、出力 56if ($vacancies) 57{ 58 echo "<ul>"; 59 foreach ($vacancies as $date => $times) 60 { 61 $date_f = date('Y年n月j日', strtotime($date)); 62 63 foreach ($times as $arr) 64 { 65 $time_f1 = substr(strval($arr[0]), -4, 2) . ":" . substr(strval($arr[0]), -2); 66 $time_f2 = substr(strval($arr[1]), -4, 2) . ":" . substr(strval($arr[1]), -2); 67 68 echo "<li>" . $date_f . $time_f1 . "〜" . $time_f2 . "</li>"; 69 } 70 } 71 echo "</ul>"; 72}

投稿2019/03/06 17:05

編集2019/03/07 07:28
cerfweb

総合スコア1899

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

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

kenkbou

2019/03/07 02:37

ありがとうございます。コメントをしていたのですが、消えてしまっていました。。 例えば、カレンダーから予定を取得してきたとして、 $taken = [ '2019-03-01' => [ [900, 1230], [1100, 1200],[1515, 1615], [1239, 1430], [1845, 1945] ], '2019-03-02' => [ [1000, 1100], [1115, 1145], [1500, 1630] ], '2019-03-03' => [ ], '2019-03-04' => [ [900, 1100], [1115, 1145], [1500, 1930] ] ]; 予定がだぶっている場合は、どのようにフィルターするのが良いでしょうか、、
cerfweb

2019/03/07 07:33

予定がダブっていても対応できるようにコードを改良しましたのでご確認ください。 ただし、$takenに配列を代入する際は日付、開始時間の昇順でソート済みであることを前提としてください。 ループ処理の中で対応するより処理速度が速くなるはずです。
kenkbou

2019/03/07 08:57

ありがとうございます、助かりました><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問