Введение в PHP
By Adam Trachtenberg and David Sklar  (8/3/99)
Перевод на русский язык Н.В.Костроминой (30.11.2000 г.).

Время и даты

В PHP имеется целый набор удобных функций для вывода дат и времени, а также для различных преобразований данных о времени и дате.

Для того, чтобы отобразить в определенном формате дату и время, воспользуйтесь функцией date(). Для нее требуется задать два аргумента: описание формата вывода даты и указание того момента времени, информацию о котором Вы хотите вывести. Указание на момент времени дается в форме "число секунд с начала 1970 года". (Если Вы хотите вывести текущее время, Вы можете воспользоваться функцией time(), которая возвращает значение текущего времени.) Функция date() имеет массу опций форматирования, таких же как у функции strftime() в C или у функции POSIX::strftime() в Perl.

<?php
$birthday_stamp = mktime(19,45,0,3,10,1975);
$birthday_formatted = date('F d, Y - g:i a',$birthday_stamp);

echo "Давид родился $birthday_formatted."
?>

дает

Давид родился March 10, 1975--7:45 p.m.

Конечно, если Вы имеете в виду конкретную дату, хитрые функции форматирования не нужны, поскольку Вы заранее точно знаете как должен выглядеть выводимый текст. Эти функции нужны, к примеру, в том случае, когда Вы выводите часть информации из заполненной пользователем формы, в которой пользователь должен был ввести дату:

<SELECT NAME="when">
<?php
$d = time();
for ($i = 0; $i < 10; $i++) {
echo '<OPTION VALUE="'.$d.'">'.date('F d',$d);
$d += 86400;
}
?>
</SELECT>

Этот кусок кода служит для вывода на экран списка выбора, включающего 10 вариантов ответа -- сегодня и каждый из последующих 9 дней. До начала выполнения цикла мы сохраняем текущее время в переменной $d. В каждом варианте выбора, задаваемом строкой <OPTION>, значение "value" устанавливается равным соответствующей временной отметке в формате Unix, а на экран выводится месяц и день ("July 27," "July 28," и так далее.) После вывода каждой даты (каждой строки <OPTION>), значение $d увеличивается на 86,400 (столько секунд в сутках -- 24 часа * 60 минут * 60 секунд).

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

<?php

function display_form() {
  global $PHP_SELF;

$dotw = array('Sunday','Monday','Tuesday','Wednesday','Thursday',
     'Friday','Saturday');
$months = array( 1 => 'January','February','March','April','May','June',
                'July','August','September','October','November','December');
?>
<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
Find the first
<SELECT NAME="dotw">
<?php
for ($i = 0; $i < 7; $i++) {
    echo "<OPTION> $dotw[$i]";
}
echo '</SELECT> after <SELECT NAME="month">';
for ($i = 1; $i <= 12; $i++) {
    echo "<OPTION VALUE=\"$i\"> $months[$i]";
}
echo '</SELECT> <SELECT NAME="day">';
for ($i = 1; $i <= 31; $i++) {
    echo "<OPTION> $i";
}
echo '</SELECT>, <SELECT NAME="year">';
$start_year = date('Y') - 10;
$end_year = $start_year + 20;
for ($i = $start_year; $i <= $end_year; $i++) {
    echo "<OPTION> $i";
}
echo '<INPUT TYPE="HIDDEN" NAME="stage" VALUE="process">';
echo '</SELECT> <INPUT TYPE="SUBMIT" VALUE="Do it!"7></FORM>';
}

?>

В этой функции очень мало таких моментов, которые мы еще не обсуждали. Массив $months записан немного по-другому, потому что мы хотим, чтобы индекс массива начинался с 1, а не с 0. Основную часть этой формы гораздо легче сформировать программно, вместо того, чтобы перечислять все значения элементов, так что единственная часть display_form(), которая формируется не в режиме PHP, - это строка в самом начале формы. Задание значений переменных $start_year и $end_year с помощью date('Y') служит для определения границ интервала времени, начинающегося за 10 лет до текущего года и заканчивающегося через 20 лет после него.

А теперь напишем функцию для обработки формы:

<?php

function process_form() {
    global $dotw;
    global $month;
    global $day;
    global $year;
    $timestamp = mktime(0,0,0,$month,$day,$year);

    $next_dotw = '';
    $next_timestamp = $timestamp;

    while ($next_dotw != $dotw) {
      $next_timestamp += 86400;
      $next_dotw = date('l',$next_timestamp);
    }

    $formatted_first = date('F d, Y',$timestamp);
    $formatted_next = date('F d, Y',$next_timestamp);
    echo "The first $dotw after $formatted_first is $formatted_next.";
}
?>

Во-первых, преобразуем введенную дату в формат, принятый в Unix. Если Вы хотите проявить осторожность, Вы можете здесь дополнительно проверить, попадает ли введенное значение в определенные рамки, хотя мы здесь такой необходимости не видим.

Затем организуется цикл перехода к следующему дню недели, пока значение "next day" не совпадет с днем недели, указанным пользователем. Пока они различаются, значение "next day" увеличивается на 86400 секунд (вы помните, это равно 24 часа * 60 минут * 60 секунд) название дня недели перевычисляется.

Когда эти два значения совпадут, process_form() выдаст следующее сообщение:

The first Sunday after June 25, 1999 is June 27, 1999.

Осталось только записать оператор, связывающий эти две функции воедино:

<?php

if (empty($stage)) { display_form(); }
else { process_form(); }

?>

Код для обработки даты и времени часто должен быть более изощренным, чем в приведенном примере, для того, например, чтобы обрабатывать переход на летнее время или временные зоны. Однако функции date() и mktime() все равно остаются основными инструментами для преобразования меток времени из формата, принятого в Unix, в понятный человеку формат и обратно. Функции date() и mktime() оперируют с отметками времени в локальной временной зоне Вашей машины. Если Вы хотите оперировать с временем по Гринвичу (Greenwich Mean Time - GMT), Вы можете использовать gmdate() и gmmktime().

Например, если Вы (и Ваш компьютер) живете во временном поясе, в котором время отстает от Гринвича на 4 часа, Вы можете написать:

<?php

$today = mktime(12,0,0,6,25,1999);
echo 'У нас сейчас '.date('g:i:s a, F d, Y',$today);
echo '';
echo 'По Гринвичу сейчас '.gmdate('g:i:s a, F d, Y',$today);

?>

Это код выдает следующее сообщение:

У нас сейчас 12:00:00 pm, June 25, 1999
По Гринвичу сейчас 4:00:00 pm, June 25, 1999
К началу страницы Заключение 


David Sklar is the CTO of Student.Net Publishing.
Adam Trachtenberg is the Vice President for Production of Student.Net Publishing.


Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости