#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/Is1Hmb4. Я вижу проблему — это происходит только в течение некоторого времени между
11:48 pm
и11:59 pm
, поскольку они правильно округляются до12:00 am
, однако они переносятся на следующий день, что приводит к сбою сопоставления. Изменение$selected
критериев для игнорирования дня исправляет это (я обновлю свой ответ исправлением)5. @YzmirRamirez — Я обновил свой ответ, который теперь правильно выбирает дату в этом временном диапазоне.