PHP

Создание выпадающих меню на основе текущей даты

Задача
Необходимо создать ряд выпадающих меню, которые автоматически привязываются текущей дате.

Решение
Для определения текущего времени во временной зоне веб-сервера вызовите функцию date() и выполните цикл по дням с помощью функции mktime().

Следующий фрагмент программы генерирует значения элемента option для текущего дня и последующих шести дней. В данном случае текущий день – 1 января 2002 года.

list($hour, $minute, $second, $month, $day, $year) =
split(':', date('h:i:s:m:d:Y'));
// печатаем последовательность дней одной недели
for ($i = 0; $i < 7; ++$i) {
$timestamp = mktime($hour, $minute, $second, $month, $day + $i, $year);
$date = date("D, F j, Y", $timestamp);
print "<option value=\"$timestamp\">$date</option>\n";
}
<option value="946746000">Tue, January 1, 2002</option>
<option value="946832400">Wed, January 2, 2002</option><option value="946918800">Thu, January 3, 2002</option>
<option value="947005200">Fri, January 4, 2002</option>
<option value="947091600">Sat, January 5, 2002</option>
<option value="947178000">Sun, January 6, 2002</option>
<option value="947264400">Mon, January 7, 2002</option>


Обсуждение
В решении мы устанавливаем атрибут value для каждой даты в ее UNIX-представлении временной метки, поскольку считаем это более простым способом для нашей программы. Конечно, вы можете использовать любой формат, который вы находите более удобным и подходящим.

Не поддавайтесь искушению исключить вызов функции mktime(); даты и время не настолько совместимы, как вы думаете. В зависимости от ваших действий, можно получить не тот результат, на который вы рассчитываете. Например:

$timestamp = mktime(0, 0, 0, 10, 24, 2002); // October 24, 2002
$one_day = 60 * 60 * 24; // number of seconds in a day
// печатаем последовательность дней одной недели
for ($i = 0; $i < 7; ++$i) {
$date = date("D, F j, Y", $timestamp);
print "<option value=\"$timestamp\">$date</option>";
$timestamp += $one_day;
}
<option value="972619200">Fri, October 25, 2002</option>
<option value="972705600">Sat, October 26, 2002</option>
<option value="972792000">Sun, October 27, 2002</option>
<option value="972878400">Sun, October 27, 2002</option>
<option value="972964800">Mon, October 28, 2002</option>
<option value="973051200">Tue, October 29, 2002</option>
<option value="973137600">Wed, October 30, 2002</option>


Этот сценарий должен напечатать месяц, день и год для семидневного периода, начиная с 24 октября 2002 года. Однако он работает не так, как ожидалось. Почему здесь два воскресенья 27 октября 2002 года? Ответ: переход на летнее время (DST). Утверждение, что количество секунд в дне постоянно, неверное; в действительности почти наверняка оно изменится.

Хуже всего то, что если вы не находитесь по времени рядом со сменой дат, то обязательно пропустите эту ошибку при тестировании.
Теги:
формы
Добавлено: 22 Июля 2018 11:20:01 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...