создание цикла для времени, увеличенного на 15 минут - PullRequest
10 голосов
/ 05 августа 2011

Я пытаюсь создать цикл, который будет выводить это:

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

Ответы [ 8 ]

15 голосов
/ 14 октября 2013

это также можно сделать с помощью функции диапазона

<?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";
}
?>

, поэтому у вас нет цикла, он просто создает массив для вас (мой цикл - просто распечатать его во время форматирования)

12 голосов
/ 05 августа 2011

Выглядит излишне сложно для меня. Следующее распечатает то, что вы хотите. Предположительно он может быть адаптирован для использования в вашем коде. Извините за грязное конечное состояние.

$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 часов, а затем многократно прибавляется пятнадцать минут. Затем вы используете некоторую математику для извлечения часов и минут из рабочей переменной.

9 голосов
/ 08 июля 2014

моя простая логика здесь

   $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>';

    }

в цикле вы можете играть, что вы хотите

8 голосов
/ 05 августа 2011

Вам нужно переместить последнюю строку за пределы внешнего цикла for.

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 запросов с вашими примерами данных)

1 голос
/ 27 июля 2014

DateInterval можно использовать для создания нового объекта dateinterval для расчета даты и использования в любом сценарии. В продвинутом объектно-ориентированном стиле PHP для всех вычислений даты и времени этот формат полезен.

Проверьте по ссылкам ниже:
http://php.net/manual/en/class.dateinterval.php
http://www.plus2net.com/php_tutorial/date-interval.php

1 голос
/ 05 августа 2011

С PHP 5> = 5.3.0 вы можете использовать DateTime::add, см .: http://www.php.net/manual/de/datetime.add.php

0 голосов
/ 13 октября 2011

Я работал над аналогичной проблемой, но время начала / окончания менялось.

это может нуждаться в небольшом уточнении, но я не могу это сломать.

Все, что вам нужно указать в начале, - это дата и время.

$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 часов 5:15 5:30 5:45 6:00 6:15 6:30 6:45 7:00 7: 15

0 голосов
/ 05 августа 2011
echo_datelist(17, 0, $day, $month, $year);

Переместить эту строку сразу после самого внешнего for -цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...