Я пытаюсь сделать цикл, который будет выводить это:
08:00 08:15 08:30 08:45 09:00 09:15 09:30 09:45
мне нужно, чтобы он проходил с 08:00 до 17:00
до сих пор мой код:
function echo_datelist ($i, $j, $day, $month, $year) { $time = str_pad($i, 2, '0', STR_PAD_LEFT).':'.str_pad($j, 2, '0', STR_PAD_LEFT); $date = strtotime("$month $day $year $time:00"); $sql = mysql_query("select b.room_type, c.name from bookings as b, customers as c where b.the_date='$date' and b.id_customer=c.id"); echo $time.'<br />'; } for ($i = 8; $i <= 16; $i++) { for ($j = 0; $j <= 45; $j+=15) echo_datelist($i, $j, $day, $month, $year); echo_datelist(17, 0, $day, $month, $year); }
проблема в том, что он выводит 17:00 между часами, например:
08:00 08:15 08:30 08:45 17:00 09:00 09:15 09:30 09:45 17:00
Вам нужно переместить последнюю строку за пределы внешнего цикла.
for ($i = 8; $i <= 16; $i++){ for ($j = 0; $j <= 45; $j+=15){ //inside the inner loop echo_datelist($i, $j, $day, $month, $year); } //inside the outer loop } //outside the outer loop echo_datelist(17, 0, $day, $month, $year);
В простом выражении вы говорите:
For each hour between 8 and 16 For each 15 minute interval Echo the time End Echo 17:00 End
Вместо:
For each hour between 8 and 16 For each 15 minute interval Echo the time End End Echo 17:00
Я бы рассмотрел возможность выполнения вашего sql-запроса для всех часов дня, а затем извлечения из них в течение времени, иначе вы будете делать запрос sql для каждого 15-минутного интервала (37 запросов с вашими данными примера)
это также можно сделать с помощью функции диапазона
<?php date_default_timezone_set("Europe/London"); $range=range(strtotime("08:00"),strtotime("17:00"),15*60); foreach($range as $time){ echo date("H:i",$time)."\n"; } ?>
так что у вас нет цикла, он просто делает массив для вас (мой цикл – это просто его распечатать во время форматирования)
Мне кажется излишне сложным. Следующее выведет, что вы хотите. Предположительно, он может быть адаптирован для использования в вашем коде. Извините за грязное конечное условие.
$min=array("00","15","30","45"); for($i=8;$i<17;$i++) foreach ($min as $v) print "$i:$v\n"; print "17:00\n";
Или, если вы хотите сделать это немного более непрозрачным способом …
for($i=8*60;$i<=17*60;$i+=15) print floor($i/60) . ":" . ($i/60-floor($i/60))*60 . "\n";
Вышеуказанное вычисляет значение минут для 8 часов, а затем добавляет пятнадцать минут. Затем вы используете некоторую математику для извлечения часов и минут из текущей переменной.
моя простая логика здесь
$start=strtotime('00:00'); $end=strtotime('23:30'); for ($i=$start;$i<=$end;$i = $i + 15*60) { //write your if conditions and implement your logic here echo date('g:i A',$i).'<br>'; }
в цикле вы можете играть, что хотите
С PHP 5> = 5.3.0 вы можете использовать DateTime::add
, см. http://www.php.net/manual/de/datetime.add.php
echo_datelist(17, 0, $day, $month, $year);
Переместите эту строку сразу после самой внешней for
-loop.
Я работал над подобной проблемой, но с временем начала / окончания менялся.
это может потребоваться немного уточнения, но я не могу его сломать.
все, что вам нужно указать в начале, это дата и время.
$day = "10/14/2011"; $startTime = date(strtotime($day." 16:00")); $endTime = date(strtotime($day." 19:15")); $timeDiff = round(($endTime - $startTime)/60/60); $startHour = date("G", $startTime); $endHour = $startHour + $timeDiff; for ($i=$startHour; $i <= $endHour; $i++) { for ($j = 0; $j <= 45; $j+=15) { $time = $i.":".str_pad($j, 2, '0', STR_PAD_LEFT); echo (date(strtotime($day." ".$time)) <= $endTime) ? date("g:i", strtotime($day." ".$time))."<br>" : ""; } }
выходы:
4:00 4:15 4:30 4:45 5:00 5:15 5:30 5:45 6:00 6:15 6:30 6:45 7:00 7:15
DateInterval
может быть использован для создания нового объекта dateinterval
для расчета даты и использования в любом скрипте. В ориентированном на PHP объектно-ориентированном стиле для всех вычислений даты и времени этот формат полезен.
Проверьте ссылки ниже:
http://php.net/manual/en/class.dateinterval.php
http://www.plus2net.com/php_tutorial/date-interval.php