Создание списка выбора с шагом в полчаса - PullRequest
13 голосов
/ 20 июня 2011

У меня есть две переменные: $start_time и $end_time. Эти значения представлены в формате 24 часа XX:XX и всегда заканчиваются либо :00, либо :30. Предполагается, что они определяют диапазон, определяющий время, которое появляется в раскрывающемся списке выбора в форме HTML, но форма отображает формат в X:XX am/pm обозначении.

Например, если у меня есть эти значения:

$start_time = "11:00";
$end_time   = "13:30";

Какой код PHP я использую для создания списка выбора, который выглядит следующим образом?

<option value="11:00">11:00 am</option>
<option value="11:30">11:30 am</option>
<option value="12:00">12:00 pm</option>
<option value="12:30">12:30 pm</option>
<option value="13:00">1:00 pm</option>
<option value="13:30">1:30 pm</option>

Я знаю, как этого добиться, создав вручную массив всех возможных значений и затем работая в обратном направлении, но должен быть гораздо более элегантный способ, использующий встроенные в PHP функции времени.

Любое руководство будет высоко ценится.

Ответы [ 9 ]

41 голосов
/ 20 июня 2011

Довольно просто с небольшим strtotime () и date () magic:

Рассмотрим:

<?php
$start = "11:00";
$end = "13:30";

$tStart = strtotime($start);
$tEnd = strtotime($end);
$tNow = $tStart;

while($tNow <= $tEnd){
  echo date("H:i",$tNow)."\n";
  $tNow = strtotime('+30 minutes',$tNow);
}

Получение материалов, правильно отформатированных и выводимых в тегах, оставлено в качестве упражнения, см. Документацию по дате ().

7 голосов
/ 20 июня 2011

Кажется, это тоже дает вам то, что вы хотите ..

$start=strtotime('10:00');
$end=strtotime('21:30');
for ($halfhour=$start;$halfhour<=$end;$halfhour=$halfhour+30*60) {
    printf('<option value="%s">%s</option>',date('H:i',$halfhour),date('g:i a',$halfhour));
}
4 голосов
/ 20 июня 2011

Я не знаю, что вы можете использовать функции даты и времени в php, так как они больше подходят для обработки определенного времени, но в целом это более элегантное решение:

$options = array();
foreach (range(0,24) as $fullhour) {
   $parthour = $fullhour > 12 ? $fullhour - 12 : $fullhour;
   $parthour .= $fullhour > 11 ? " pm" : " am";
   $options["$fullhour:00"] = $parthour;
   $options["$fullhour:30"] = $parthour;
}
2 голосов
/ 25 декабря 2011

Попробуйте создать массив времени с интервалом 30 минут. Я проверил это.

    $options = array(); $min30=array('00','30');
    foreach (range(0,23) as $fullhour) {
       $parthour = $fullhour > 12 ? $fullhour - 12 : $fullhour;
        foreach($min30 as $int){
            if($fullhour > 11){
                $options[$fullhour.".".$int]=$parthour.":".$int." PM";
            }else{
                if($fullhour == 0){$parthour='12';}
                $options[$fullhour.".".$int]=$parthour.":".$int." AM" ;
            }
        }
    }
    print_r($options);
1 голос
/ 20 ноября 2015

Другим подходом может быть полное решение вашей проблемы с использованием PHP с использованием объекта DateTime:

// Make a DateTime object with the current date and time
$today = new DateTime();

// Make an empty array to contain the hours
$aHours = array();

// Make another DateTime object with the current date and time
$oStart = new DateTime('now');

// Set current time to midnight
$oStart->setTime(0, 0);

// Clone DateTime object (This is like 'copying' it)
$oEnd = clone $oStart;

// Add 1 day (24 hours)
$oEnd->add(new DateInterval("P1D"));

// Add each hour to an array
while ($oStart->getTimestamp() < $oEnd->getTimestamp()) {
    $aHours[] = $oStart->format('H');
    $oStart->add(new DateInterval("PT1H"));
}

// Create an array with halfs
$halfs = array(
    '0',
    '30',
);

// Get the current quarter
$currentHalf = $today->format('i') - ($today->format('i') % 30);

Затем напечатать:

<select name="" id="">
    <option value="-1">Choose a time</option>
    <?php foreach ($aHours as $hour): ?>
        <?php foreach ($halfs as $half): ?>
            <option value="<?= sprintf("%02d:%02d", $hour, $half); ?>" <?= ($hour == $today->format('H') && $half == $currentHalf) ? 'selected' : ''; ?>>
                <?= sprintf("%02d:%02d", $hour, $half); ?>
            </option>
        <?php endforeach; ?>
    <?php endforeach; ?>
</select>

В приведенном выше примере вы создадите раскрывающийся список со всеми часами дня. Текущий час и полчаса будут выбраны автоматически.

1 голос
/ 13 августа 2012

Основываясь на коде взрыва таблетки, я думаю, что это правильный путь.

$options = array();
foreach (range(0,23) as $fullhour) 
{
    $parthour = $fullhour > 12 ? $fullhour - 12 : $fullhour;
    $sufix = $fullhour > 11 ? " pm" : " am";

    $options["$fullhour:00"] = $parthour.":00".$sufix;
    $options["$fullhour:30"] = $parthour.":30".$sufix;
}
0 голосов
/ 07 сентября 2018

Вот решение для 12 часов с AM / PM:

<?php
$steps   = 15; // only edit the minutes value
$current = 0;
$loops   = 24*(60/$steps);

for ($i = 0; $i < $loops; $i++) {
    $hour = $i/(60/$steps);
    $time = sprintf('%02d:%02d %s', $hour, $current%60, intval($hour/12) == 0 ? ' AM' : ' PM');
    echo '<option>'.$time.'</option>';
    $current += $steps;
}
?>

И для 24 часов:

<?php
$steps   = 15; // only edit the minutes value
$current = 0;
$loops   = 24*(60/$steps);

for ($i = 0; $i < $loops; $i++) {
    $time = sprintf('%02d:%02d', $i/(60/$steps), $current%60);
    echo '<option>'.$time.'</option>';
    $current += $steps;
}
?>
0 голосов
/ 11 августа 2017
<select>
  <?php
     $h = 0;
     $m = 0;
     while ($h != 24.5) {
       if(strpos($h,".") !== false){
           $v = ($h-0.5).'30';
       }else{
           $v = $h.'00';
       }
       if ($h < 10) {
           $v = '0'.$v;
       }
       echo '<option>'.$v.'</option>';

       $h = $h + 0.5;
     }
  ?>
</select>
0 голосов
/ 22 октября 2013

Это полная рабочая версия, и я ее использую (модифицировано сверху). Внесенное мной изменение было отформатировано для тега option для входа в базу данных sql. Я также изменил с 00:00 до полуночи и с 12:00 до полудня.

(снова отредактировано для отображения опции выбора)

<select name="starttime">
<?php 
foreach (range(0,23) as $fullhour) {
$fullhour2digit = strlen($fullhour)==1 ? '0' . $fullhour : $fullhour;
$parthour = $fullhour > 12 ? $fullhour - 12 : $fullhour;
$parthour .= $fullhour > 11 ? ":00 pm" : ":00 am";
$parthour = $parthour=='0:00 am' ? 'midnight' : $parthour;
$parthour = $parthour=='12:00 pm' ? 'noon' : $parthour;

$parthalf = $fullhour > 12 ? $fullhour - 12 : $fullhour;
$parthalf .= $fullhour > 11 ? ":30 pm" : ":30 am";


//SHOWS THE TEST FOR 'SELECTED' IN THE OPTION TAG
     echo '<option ';
     if (date("H:i:s", strtotime($startdate)) === $fullhour2digit . ':00:00')
        {echo ' SELECTED ';}
     echo 'value="' . $fullhour2digit . ':00:00">' .  $parthour . '</option>';
     echo '<option ';
     if (date("H:i:s", strtotime($startdate)) === $fullhour2digit  . ':30:00')
        {echo ' SELECTED ';}
     echo 'value="' . $fullhour2digit . ':30:00">' .  $parthalf . '</option>';
}
?>
</select>

Это выводит (усечено) ...

<select name="starttime">
<option value="00:00:00">midnight</option><option value="00:30:00">0:30 am</option>
 ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...