Создание списка выбора с шагом в полчаса
У меня есть две переменные: $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.
Любое руководство будет высоко оценено.
Ответы
Ответ 1
Довольно легко с помощью 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);
}
Получение материала, правильно отформатированного и выводимого в тегах, остается как упражнение, см. документы для даты().
Ответ 2
Это похоже на то, что вы тоже хотите.
$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));
}
Ответ 3
Я не знаю, что вы можете использовать функции даты и времени 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;
}
Ответ 4
Попробуйте создать массив времени с интервалом 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);
Ответ 5
На основе кода Explosion Pills я думаю, что это правильный путь.
$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;
}
Ответ 6
Другой подход может заключаться в том, чтобы полностью решить вашу проблему с помощью 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>
В приведенном выше примере вы создадите выпадающее меню со всеми часами дня. Текущий час и полчаса будут автоматически выбраны.
Ответ 7
Это полная рабочая версия, и я использую ее (измененный сверху). Изменение, которое я сделал, имело значение тега опции, отформатированного для входа в sql db. Я также изменил 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>
....
Ответ 8
<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>