Перевод на русский язык Н.В.Костроминой (30.11.2000 г.).
Время и даты
В PHP имеется целый набор удобных функций для вывода дат и времени, а
также для различных преобразований данных о времени и дате.
Для того, чтобы отобразить в определенном формате дату и время, воспользуйтесь
функцией date(). Для нее требуется задать
два аргумента: описание формата вывода даты и указание того
момента времени, информацию о котором Вы хотите вывести. Указание на
момент времени дается в форме "число секунд с начала 1970 года". (Если
Вы хотите вывести текущее время, Вы можете воспользоваться
функцией time(), которая возвращает
значение текущего времени.) Функция
date() имеет массу опций форматирования,
таких же как у функции strftime() в C или
у функции POSIX::strftime() в Perl.
echo "Давид родился $birthday_formatted."
дает
Давид родился March 10, 1975--7:45 p.m.
Конечно, если Вы имеете в виду конкретную дату, хитрые функции форматирования
не нужны, поскольку Вы заранее точно знаете как должен выглядеть выводимый текст.
Эти функции нужны, к примеру, в том случае, когда Вы выводите часть
информации из заполненной пользователем формы, в которой пользователь должен
был ввести дату:
Этот кусок кода служит для вывода на экран списка выбора, включающего
10 вариантов ответа -- сегодня и каждый из последующих 9 дней.
До начала выполнения цикла мы сохраняем текущее время в переменной
$d. В каждом варианте выбора, задаваемом
строкой <OPTION>, значение "value"
устанавливается равным соответствующей временной отметке в формате Unix,
а на экран выводится месяц и день ("July 27," "July 28," и так далее.)
После вывода каждой даты (каждой строки <OPTION>),
значение $d увеличивается на 86,400 (столько
секунд в сутках -- 24 часа * 60 минут * 60 секунд).
Применяя функции mktime() и
date() Вы можете сформировать и вывести
любую информацию, производную от введенной пользователем даты. Предположим,
что Вы хотите определить, каким числом будет первая суббота (или
любой другой день недели) после указанной даты. Во-первых, напишем
функцию, которая будет выдавать соответствующую форму запроса:
function display_form() {
$dotw = array('Sunday','Monday','Tuesday','Wednesday','Thursday',
?>
В этой функции очень мало таких моментов, которые мы еще не обсуждали.
Массив $months записан немного по-другому,
потому что мы хотим, чтобы индекс массива начинался с 1, а не с 0. Основную
часть этой формы гораздо легче сформировать программно, вместо того,
чтобы перечислять все значения элементов, так что единственная часть
display_form(), которая формируется не
в режиме PHP, - это строка в самом начале формы. Задание значений
переменных $start_year и
$end_year с помощью date('Y')
служит для определения границ интервала времени, начинающегося за 10 лет
до текущего года и заканчивающегося через 20 лет после него.
А теперь напишем функцию для обработки формы:
function process_form() {
$next_dotw = '';
while ($next_dotw != $dotw) {
$formatted_first = date('F d, Y',$timestamp);
Во-первых, преобразуем введенную дату в формат, принятый в Unix. Если
Вы хотите проявить осторожность, Вы можете здесь дополнительно проверить,
попадает ли введенное значение в определенные рамки, хотя мы здесь такой
необходимости не видим.
Затем организуется цикл перехода к следующему дню недели, пока
значение "next day" не совпадет с днем недели, указанным пользователем.
Пока они различаются, значение "next day" увеличивается на 86400 секунд
(вы помните, это равно 24 часа * 60 минут * 60 секунд) название
дня недели перевычисляется.
Когда эти два значения совпадут, process_form()
выдаст следующее сообщение:
The first Sunday after June 25, 1999 is June 27, 1999.
Осталось только записать оператор, связывающий эти две функции воедино:
if (empty($stage)) { display_form(); }
?>
Код для обработки даты и времени часто должен быть более изощренным, чем
в приведенном примере, для того, например, чтобы обрабатывать переход
на летнее время или временные зоны. Однако функции date()
и mktime() все равно остаются основными
инструментами для преобразования меток времени из формата, принятого в
Unix, в понятный человеку формат и обратно. Функции
date() и mktime()
оперируют с отметками времени в локальной временной зоне Вашей машины.
Если Вы хотите оперировать с временем по Гринвичу (Greenwich Mean Time - GMT),
Вы можете использовать
gmdate() и gmmktime().
Например, если Вы (и Ваш компьютер) живете во временном поясе, в котором время
отстает от Гринвича на 4 часа, Вы можете написать:
$today = mktime(12,0,0,6,25,1999);
?>
Это код выдает следующее сообщение:
<?php
$birthday_stamp = mktime(19,45,0,3,10,1975);
$birthday_formatted = date('F d, Y - g:i a',$birthday_stamp);
?>
<SELECT NAME="when">
<?php
$d = time();
for ($i = 0; $i < 10; $i++) {
echo '<OPTION VALUE="'.$d.'">'.date('F d',$d);
$d += 86400;
}
?>
</SELECT>
<?php
global $PHP_SELF;
'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>';
}
<?php
global $dotw;
global $month;
global $day;
global $year;
$timestamp = mktime(0,0,0,$month,$day,$year);
$next_timestamp = $timestamp;
$next_timestamp += 86400;
$next_dotw = date('l',$next_timestamp);
}
$formatted_next = date('F d, Y',$next_timestamp);
echo "The first $dotw after $formatted_first is $formatted_next.";
}
?>
<?php
else { process_form(); }
<?php
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.