Разработчику. Сборник рецептов 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). Утверждение, что количество секунд в дне постоянно, неверное; в действительности почти наверняка оно изменится. Хуже всего то, что если вы не находитесь по времени рядом со сменой дат, то обязательно пропустите эту ошибку при тестировании.

См. также

Документацию по функции date() на http://www.php.net/date и mktime() на http://www.php.net/mktime.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ