@MinorityMeaning ну так всё круто же оно вернуло тебе число с которым ты можешь сравнивать те с time() слушай меня- кто тут из нас программист?
Из этого я делаю вывод: в PHP нельзя просто так вычитать и слаживать даты. То есть, сначала я превращаю их в секунды, потом вычитаю или сравниваю. А как потом работать с результатом в секундах? Например если я захочу вывести его в формате hh:mm или просто в минутах. Например для вывода: Конец пары: через 70 минут.
хз что такое слаживать, но я у тебя второй раз спрошу (третий не стану - я перестану писать в тему): что ты вообще хочешь получить складывая и вычитая даты?
ты не знаешь, сколько секунд в минуте? ну раздели полученную разницу на 60 и будут тебе минуты. Если хочешь красивые периоды - для этого есть методы объекта даты http://php.net/manual/en/datetime.diff.php см пример. Но нахрена тебе это нужно? У тебя что, бывает так, что пара может длиться "4 год 3 мес 16 день 2 час 07 минут"? Забей. Просто дели на 60 и всё. --- Добавлено --- @abrdabr понятно @MinorityMeaning Длительность это не дата. Длительность это период времени. Дата - это отметка на календаре. Если посчитать расстояние между датами - это не будет датой. Поэтому его нельзя прогнать через функцию даты. Все даты - относительны начала отсчета. Все расстояния абсолютны, не зависимо от начала отсчета. Вот в чем соль.
Ну хорошо. Конкретно в моём случае, нужно вычесть от времени окончания пары текущее время, чтобы узнать сколько осталось до окончания пары Лягу ка я спать, обмозгую всё это дело во сне, глядишь завтра набросаю алгоритм. Если что, напишу о результатах или проблемах
@igordata @denis01 @abrdabr , товарищи, разобрался с функцией strtotime() PHP: <?php date_default_timezone_set('Asia/Yakutsk'); $tekdate = strtotime(date('G:i')); $nachalo = strtotime('8:30'); echo ($timestamp-$tekdate)/60; ?> Оказывается он превращает время в секунды!
PHP: $nachalo = [ "strtotime('8:30')", "strtotime('10:15')", "strtotime('12:00')", "strtotime('14:05')", "strtotime('15:50')", "strtotime('17:35')", ]; echo $nachalo[0]; Результат: Выводит strtotime('8:30') А есть ли возможность использовать strtotime внутри массива так, чтобы он выполнялся?
То есть мне нужно поступить вот так: PHP: array_walk($nachalo, 'strtotime'); И уже потом:echo $nachalo[0] выведет то что нужно
@abrdabr не смог разобраться с array_walk Но вроде foreach справляется с задачей: PHP: $nachalo = [ "8:30", "10:15", "12:00", "14:05", "15:50", "17:35", ]; foreach ($nachalo as &$value) { $value = strtotime($value); }; unset($value); echo $nachalo[0], $nachalo[5] ; Спасибо, буду думать дальше
Я в PHP новичок, решил для опыта помочь ТС, посмотрите, может где есть какие замечания или ошибки, вроде все работает, с окончаниями только надо допилить. Исходник залил в архив. PHP: <?php $now = date('G:i'); //$now = "13:36"; //echo $now; //print_r($par); $par = array( '1par-min' => "8:30", '1par-min-min' => "9:15", '1par-min-max' => "9:20", '1par-max' => "10:05", '2par-min' => "10:15", '2par-min-min' => "11:00", '2par-min-max' => "11:05", '2par-max' => "11:50", '3par-min' => "12:00", '3par-min-min' => "12:45", '3par-min-max' => "12:50", '3par-max' => "13:35", '4par-min' => "14:05", '4par-min-min' => "14:50", '4par-min-max' => "14:55", '4par-max' => "15:40", '5par-min' => "15:50", '5par-min-min' => "16:35", '5par-min-max' => "16:40", '5par-max' => "17:25", '6par-min' => "17:35", '6par-min-min' => "18:20", '6par-min-max' => "18:25", '6par-max' => "19:10", ); function DateCheck($date, $min, $max) { $date_min = new DateTime($min); // минимальное значение времени $date_max = new DateTime($max); // максимальное значение времени $date_now = new DateTime($date); // текущее значение времени // Проверяем, находится ли $date_now в диапазоне if ($date_now >= $date_min && $date_now <= $date_max) { return true; } return false; } function DateDiff($date1, $date2, $per = ''){ //$date1 = new DateTime("now"); $date1 = new DateTime($date1); $date2 = new DateTime($date2); $interval = $date2->diff($date1); if (empty($per)) { return $interval->format("%h часов, %i минут\n"); } else return $interval->format("%i минут\n"); } if (DateCheck($now, $par['1par-min'], $par['1par-min-min']) or DateCheck($now, $par['1par-min-max'], $par['1par-max'])) { $para = '1-я пара'; } elseif (DateCheck($now, $par['1par-min-min'], $par['1par-min-max'])) { $para = '1-я пара (перерыв пятиминутка)'; } elseif (DateCheck($now, $par['1par-max'], $par['2par-min'])) { $para = 'перерыв'; $perer_1 = 1; } elseif (DateCheck($now, $par['2par-min'], $par['2par-min-min']) or DateCheck($now, $par['2par-min-max'], $par['2par-max'])) { $para = '2-я пара'; } elseif (DateCheck($now, $par['2par-min-min'], $par['2par-min-max'])) { $para = '2-я пара (перерыв пятиминутка)'; } elseif (DateCheck($now, $par['3par-max'], $par['3par-min'])) { $para = 'перерыв'; $perer_2 = 1; } elseif (DateCheck($now, $par['3par-min'], $par['3par-min-min']) or DateCheck($now, $par['3par-min-max'], $par['3par-max'])) { $para = '3-я пара'; } elseif (DateCheck($now, $par['3par-min-min'], $par['3par-min-max'])) { $para = '3-я пара (перерыв пятиминутка)'; } elseif (DateCheck($now, $par['3par-max'], $par['4par-min'])) { $para = 'перерыв'; $perer_3 = 1; } elseif (DateCheck($now, $par['4par-min'], $par['4par-min-min']) or DateCheck($now, $par['4par-min-max'], $par['4par-max'])) { $para = '4-я пара'; } elseif (DateCheck($now, $par['4par-min-min'], $par['4par-min-max'])) { $para = '4-я пара (перерыв пятиминутка)'; } elseif (DateCheck($now, $par['4par-max'], $par['5par-min'])) { $para = 'перерыв'; $perer_4 = 1; } elseif (DateCheck($now, $par['5par-min'], $par['5par-min-min']) or DateCheck($now, $par['5par-min-max'], $par['5par-max'])) { $para = '5-я пара'; } elseif (DateCheck($now, $par['5par-min-min'], $par['5par-min-max'])) { $para = '5-я пара (перерыв пятиминутка)'; } elseif (DateCheck($now, $par['5par-max'], $par['6par-min'])) { $para = 'перерыв'; $perer_5 = 1; } elseif (DateCheck($now, $par['6par-min'], $par['6par-min-min']) or DateCheck($now, $par['6par-min-max'], $par['6par-max'])) { $para = '6-я пара'; } elseif (DateCheck($now, $par['6par-min-min'], $par['6par-min-max'])) { $para = '6-я пара (перерыв пятиминутка)'; } else { $para = 'Занятия окончены'; $perer_11 = 1; } if (isset($perer_11)) { $end='Начало пары: 1-я пара через '; $end.=' '; $end.= DateDiff($now, $par['1par-min']); } elseif (isset($perer_1)) { $end='Начало пары: 2-я пара через '; $end.=' '; $end.= DateDiff($now, $par['2par-min']); } elseif (isset($perer_2)) { $end='Начало пары: 3-я пара через'; $end.=' '; $end.= DateDiff($now, $par['3par-min']); } elseif (isset($perer_3)) { $end='Начало пары: 4-я пара через'; $end.=' '; $end.= DateDiff($now, $par['4par-min']); } elseif (isset($perer_4)) { $end='Начало пары: 5-я пара через'; $end.=' '; $end.= DateDiff($now, $par['5par-min']); } elseif (isset($perer_5)) { $end='Начало пары: 6-я пара через'; $end.=' '; $end.= DateDiff($now, $par['6par-min']); } else { switch ($para) { case "1-я пара": $end='Конец пары: 1-я пара через'; $end.=' '; $end.= DateDiff($now, $par['1par-max']); break; case "2-я пара": $end='Конец пары: 2-я пара через'; $end.=' '; $end.= DateDiff($now, $par['2par-max']); break; case "3-я пара": $end='Конец пары: 3-я пара через'; $end.=' '; $end.= DateDiff($now, $par['3par-max']); break; case "4-я пара": $end='Конец пары: 4-я пара через'; $end.=' '; $end.= DateDiff($now, $par['4par-max']); break; case "5-я пара": $end='Конец пары: 5-я пара через'; $end.=' '; $end.= DateDiff($now, $par['5par-max']); break; case "6-я пара": $end='Конец пары: 6-я пара через'; $end.=' '; $end.= DateDiff($now, $par['6par-max']); break; case "1-я пара (перерыв пятиминутка)": $end='Конец перерыва: через'; $end.=' '; $end.= DateDiff($now, $par['1par-min-max'], 1); break; case "2-я пара (перерыв пятиминутка)": $end='Конец перерыва: через'; $end.=' '; $end.= DateDiff($now, $par['2par-min-max'], 1); break; case "3-я пара (перерыв пятиминутка)": $end='Конец перерыва: через'; $end.=' '; $end.= DateDiff($now, $par['3par-min-max'], 1); break; case "4-я пара (перерыв пятиминутка)": $end='Конец перерыва: через'; $end.=' '; $end.= DateDiff($now, $par['4par-min-max'], 1); break; case "5-я пара (перерыв пятиминутка)": $end='Конец перерыва: через'; $end.=' '; $end.= DateDiff($now, $par['5par-min-max'], 1); break; case "6-я пара (перерыв пятиминутка)": $end='Конец перерыва: через'; $end.=' '; $end.= DateDiff($now, $par['6par-min-max'], 1); break; } } ?> <div> <h2>Идет: </h2> <?php echo '<p>'.$para.'.</p>'; echo '<p>'.$end.'</p><br>'; ?> </div>
Ну надо же, вот так дела. Я тут смотрю ты и с пятиминутками заморочился! А я тут с горем пополам свою версию состряпал, только она пятиминутки игнорирует: PHP: <?php date_default_timezone_set('Asia/Yakutsk'); $tekdate = strtotime(date('G:i')); //Присваиваем текущее время! $nachalo = [ // Расписание начала пар! "8:30", "10:15", "12:00", "14:05", "15:50", "17:35", ]; foreach ($nachalo as &$value) { $value = strtotime($value); }; unset($value); $konec = [ // Расписание окончания пар! "10:05", "11:50", "13:35", "15:40", "17:25", "19:10", ]; foreach ($konec as &$value) { $value = strtotime($value); }; unset($value); $timeNight = strtotime('23:59'); $timeMorning = strtotime('0:00'); if ($tekdate >= $nachalo[0] && $tekdate < $konec[5]) { if ($tekdate >= $nachalo[0] && $tekdate < $konec[0]) {echo '1 Пара', ' До конца занятия: ', ($konec[0]-$tekdate)/60; } elseif ($tekdate >= $konec[0] && $tekdate < $nachalo[1]) { echo 'Перерыв', ' До начала 2 пары: ', ($nachalo[1]-$tekdate)/60; }; if ($tekdate >= $nachalo[1] && $tekdate < $konec[1]) {echo '2 Пара', ' До конца занятия: ', ($konec[1]-$tekdate)/60; } elseif ($tekdate >= $konec[1] && $tekdate < $nachalo[2]) { echo 'Перерыв', ' До начала 3 пары: ', ($nachalo[2]-$tekdate)/60; }; if ($tekdate >= $nachalo[2] && $tekdate < $konec[2]) {echo '3 Пара', ' До конца занятия: ', ($konec[2]-$tekdate)/60; } elseif ($tekdate >= $konec[2] && $tekdate < $nachalo[3]) { echo 'Перерыв', ' До начала 4 пары: ', ($nachalo[3]-$tekdate)/60; }; if ($tekdate >= $nachalo[3] && $tekdate < $konec[3]) {echo '4 Пара', ' До конца занятия: ', ($konec[3]-$tekdate)/60; } elseif ($tekdate >= $konec[3] && $tekdate < $nachalo[4]) { echo 'Перерыв', ' До начала 5 пары: ', ($nachalo[4]-$tekdate)/60; }; if ($tekdate >= $nachalo[4] && $tekdate < $konec[4]) {echo '5 Пара', ' До конца занятия: ', ($konec[4]-$tekdate)/60; } elseif ($tekdate >= $konec[4] && $tekdate < $nachalo[5]) { echo 'Перерыв', ' До начала 6 пары: ', ($nachalo[5]-$tekdate)/60; }; if ($tekdate >= $nachalo[5] && $tekdate < $konec[5]) {echo '6 Пара', ' До конца занятия: ', ($konec[5]-$tekdate)/60; }; } elseif ($tekdate >= $konec[5] && $tekdate <= $timeNight) { echo ' Занятия окончены ';} elseif ($tekdate >= $timeMorning && $tekdate <= $nachalo[0]) { echo ' Начало занятий в 8:30 ';}; ?> И ещё одна вещь: Нужно же чтобы ещё алгоритм умел различать дни недели. То есть, если конкретнее, чтобы в воскресение выводил, например :СЕГОДНЯ ВЫХОДНОЙ
Ну да, решил, чтобы все учитывалось, но может где ошибся, посмотри.. В своем коде сделаю легко, подожди часок, освобожусь допишу, что еще нужно?
@AnonimS вручную задавал время, отображает всё правильно =) Задачи выполняются, больше и не нужно ничего
Вот поменяй на это PHP: ...... <?php if (date("w") != 0): ?> <div> <h2>Идет: </h2> <?php echo '<p>'.$para.'.</p>'; echo '<p>'.$end.'</p><br>'; ?> </div> <?php else: ?> <div> <h2>Сегодня воскресенье, какая учеба?</h2> </div> <?php endif ?> <div> <h2>Время сейчас: <br><?php echo $now; ?></h2> </div> ......
Поставили мне зачёт, однако. Препод нашептал в деканате, мол я пхп знаю и все дела, а те позвали на беседу мол плагин надо сделать для сайта. На вордпресе он у них. Я конечно понятия не имел, как они делаются, но сказал сделаю что смогу. Они почему то, по своим соображениям не хотят пользоваться готовыми плагинами, этак вот свой должен быть, и всё тут. Создам я, в общем, темку в нужном разделе, попробую также, по старой схеме работать, путём расспросов и наводок. Ещё раз спасибо всем за помощь, и до встречи!
Ну ты все рассказал, как скрипт работает? Создавай, только на будущее, описывай задачу как можно подробнее, по ту сторону экрана тоже люди, которые не в теме, чего там тебе объясняли. Удачи!