Термопластавтоматы альянс термопластавтомат.
Введение в 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.