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

#php #select #time #timezone

#php #выберите #время #Часовой пояс

Вопрос:

У меня есть PHP-скрипт для выпадающего списка select для отображения времени с интервалом в 15 минут; однако я хотел бы, чтобы по умолчанию использовалось ближайшее текущее время (округление в большую или меньшую сторону на основе 15-минутного интервала). Есть идеи?

 date_default_timezone_set($_SESSION['TIME_ZONE'])

<label id="time_label" for="time" class="label">Time:</label>

<select id="time" name="time">

    <option value="">Select</option>

    <?

       $start = strtotime('12:00am');
       $end = strtotime('11:59pm');
       for ($i = $start; $i <= $end; $i  = 900){
           echo '<option>' . date('g:i a', $i);
       }
    ?>

</select>
  

Комментарии:

1. Просто для ясности, когда текущее время 11:53-11: 59 вечера, в выпадающем списке следует выбрать 12:00am , правильно?

Ответ №1:

 <label id="time_label" for="time" class="label">Time:</label>

<select id="time" name="time">

<option value="">Select</option>

<?php

$start = strtotime('12:00am');
$end = strtotime('11:59pm');
$now = strtotime('now');
$nowPart = $now % 900;
 if ( $nowPart >= 450) {
    $nearestToNow =  $now - $nowPart   900;
    if ($nearestToNow > $end) { // bounds check
        $nearestToNow = $start;
    }
} else {
    $nearestToNow = $now - $nowPart;
}
for ($i = $start; $i <= $end; $i  = 900){
    $selected = '';
    if ($nearestToNow == $i) {
        $selected = ' selected="selected"';
    }
    echo "t<option" . $selected . '>' . date('g:i a', $i) . "n";
}
?>

</select>
  

Вот некоторый отладочный код, который я оставил в:

 <?php

echo '<p></p>DEBUG $now = '. date('Y-m-d g:ia', $now) . "<br />n";
echo "DEBUG $nowPart = $nowPart<br />n";
echo 'DEBUG $nearestToNow = '. date('Y-m-d g:ia', $nearestToNow) . "<br />n";
?>
  

Комментарии:

1. Вот приведенный выше код с работающим тестовым примером для 11: 55 вечера (выбирается вариант 12:00 утра, второй вариант в списке) codepad.viper-7.com/X5Q6r5

Ответ №2:

Вот удобный способ округлить текущее время в большую или меньшую сторону:

 $time = time();
$rounded_time = $time % 900 > 450 ? $time  = (900 - $time % 900):  $time -= $time % 900;

$start = strtotime('12:00am');
$end = strtotime('11:59pm');
for( $i = $start; $i <= $end; $i  = 900) 
{
    $selected = ( $rounded_time == $i) ? ' selected="selected"' : '';
    echo '<option' . $selected . '>' . date('g:i a', $i) . '</option>';
}
  

Вы можете использовать следующую демонстрацию для тестирования, просто добавьте 450 или 900 к $time переменной.

Редактировать: Согласно приведенным ниже комментариям, есть одно условие, которое не выполняется, поскольку округленное время приводит к переносу на следующий день. Чтобы исправить это, измените $selected строку на:

 $selected = ( ($rounded_time - $i) % (86400) == 0) ? ' selected="selected"' : '';
  

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

ДЕМОНСТРАЦИЯ

Комментарии:

1. @YzmirRamirez Упс! При копировании / вставке была добавлена скобка. Исправлено, теперь должно работать нормально, спасибо!

2. Только что попробовал с $time = strToTime('11:55pm'); , и ничего не было выбрано. Это было задумано?

3. Похоже, это работает, потому что 12:00 утра — первый вариант в списке. Однако в исходном случае первым элементом в выпадающем списке был <option value="">Select</option> . Вот тест с экранированными <option> тегами: codepad.viper-7.com/Is1Hmb

4. Я вижу проблему — это происходит только в течение некоторого времени между 11:48 pm и 11:59 pm , поскольку они правильно округляются до 12:00 am , однако они переносятся на следующий день, что приводит к сбою сопоставления. Изменение $selected критериев для игнорирования дня исправляет это (я обновлю свой ответ исправлением)

5. @YzmirRamirez — Я обновил свой ответ, который теперь правильно выбирает дату в этом временном диапазоне.