Как сделать время выпадающего списка по умолчанию текущим временем? - PullRequest
1 голос
/ 13 ноября 2011

У меня есть PHP-скрипт для выпадающего списка выбора для отображения времени с 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>

Ответы [ 2 ]

3 голосов
/ 13 ноября 2011
<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";
?>
2 голосов
/ 13 ноября 2011

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

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

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

Демо

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