Sources.RU Magazine Поиск по журналу
 

Ссылки

Предлагаем строительный кирпич в городе Рязань по выгодным ценам.

Ваш возраст на PHP

Автор: Denikus

Очень часто на страницах интернет-форумов встречаю вопросы касающиеся вычисления периода времени между заданными датами при помощи языка программирования PHP. Целью данной статьи является решение данного вопроса.

Предполагается, что Вы уже знакомы с основами PHP. Итак, начнем.

Для получения даты и времени в PHP используется функция date().

string date(string format [, int timestamp])

Разберем поподробнее. Первый аргумент передаваемы в функцию - это формат даты, а второй, необязательный, - это метка времени Unix. Функция возвращает строку даты, которая указанная в метке Unix (timestamp), отформатированной в соответствии с аргументом format. Если метка Unix (timestamp) не указана , то функция возвратит текущую дату.

Пришло время разобраться с так называемой "меткой Unix". Дело в том, что Unix-подобные системы хранят текущее время в виде 32-разрядного целого числа секунд, начиная с полуночи 1 января 1970 года по Гринвичу. Максимально возможной датой в метках может быть записано 19 января 2038 года. Далее Вы поймете насколько удобны метки Unix в использовании, а теперь рассмотрим возможные коды форматирования даты.

В строке формата (string format) функции date() распознаются следующие символы:

Код Описание
a Функция date() вернет «am» до полудня или после - «pm» ( в зависимости от времени суток)
A То же что и в предыдущем случае только прописными символами «AM» или «PM»
B Интернет-время swatch(универсальная временная схема)
d День месяца в виде двузначного числа с ведущим нулем (от «01» до «31»)
D Трехбуквенная аббревиатура дня недели (от «Mon» до «Sun»)
F Название месяца в текстовом формате (от «January» до «December»)
g Часы в 12-ти часовом формате (от «1» до «12»)
G Часы в 24-х часовом формате (от «0» до «23»)
h Часы в 12-ти часовом формате с ведущими нулями (от «01» до «12»)
H Часы в 24-х часовом формате с ведущими нулями (от «0» до «23»)
i Минуты с ведущими нулями (от «00» до «59»)
I Определяет, установлен ли переход на летнее время и обратно(«1» - если установлен, «0» - иначе)
j День месяца без ведущих нулей(от «1» до «31»)
l День недели в полнотекстовом формате (от «Monday» до «Sunday»)
L Определяет, является ли год високосным («1» - является, «0» - иначе)
m Месяц в виде двузначного числа с ведущими нулями (от «01» до «12»)
M Трехбуквенная аббревиатура названия месяца (от «Jan» до «Dec»)
n Месяц в виде числа без ведущих нулей (от «1» до «12»)
s Секунды с ведущими нулями (от «00» до «59»)
S Двузначный английский суффикс для дня месяца(«st», «nd», «rd» или «th»), зависит от числа.
t Количество дней в месяце (от «28» до «31»)
T Часовой пояс (временная зона) сервера (например «MDT»)
U Число секунд начиная с 1 января 1970 года до текущего времени
w День недели, представленный в виде числа (от «0» - воскресенье, до «6» - суббота)
y Год в виде двузначного числа (например «99»)
Y Год в четырехзначном формате (например «2004»)
z День года в числовом виде (от «0» до «365»)
Z Смещение текущего часового пояса в секундах (от «-43200» до «43200»)

Теперь, получив все необходимые данные, рассмотрим применение всего этого богатства. Начнем с простого - выведем текущую дату в формате "день недели число месяц год".

<?
echo "Today is ".date("l jS of F Y");
?>

Выполнив скрипт, вы получите в браузере нечто подобное:

Today is Sunday 28th of March 2004

Теперь, будучи уверенными в собственных силах, усложним задачу. Высчитаем, сколько прошло лет, дней, часов, минут и секунд с момента Вашего рождения.

<?
// Указываем дату и время Вашего рождения(для примера
// возьмем 21 мая 1982 года 19 часов 12 минут и 10 секунд :) )
$sec = 10;
$min = 12;
$hour = 19;

$day = 21;
$month = 5;
$year = 1982;

//Теперь вычислим метку Unix для указанной даты
$birthdate_unix = mktime($hour, $min, $sec, $month, $day, $year);

//Вычислим метку unix для текущего момента
$current_unix = time();

//Просчитаем разность меток
$period_unix=$current_unix - $birthdate_unix; // Получаем искомый возраст // Возраст измеряемый годами $age_in_years = floor($period_unix / (365*24*60*60)); // Возраст измеряемый днями $age_in_days = floor($period_unix / (24*60*60)); // Возраст измеряемый часами $age_in_hours = floor($period_unix / (60*60)); // Возраст измеряемый минутами $age_in_minutes = floor($period_unix / 60); // Возраст измеряемый секундами $age_in_seconds = $period_unix; // Теперь выводим все это на экран echo "Ваш возраст составляет $age_in_years год или $age_in_days день, или $age_in_hours часов, или $age_in_minutes минут, или $age_in_seconds секунд."; ?>

Если все введено правильно, то Вы увидите на экране примерно следующее:

Ваш возраст составляет 21 год или 7981 день, или 191566 часов, или 11494009 минут, или 689640542 секунд.

Обновляя страницу браузера, можно наблюдать как неумолимо приближается старость (или зрелость :)).

Небольшой комментарий к программе. Мы использовали фукцию time().

int time(void)

Как видно из программы она возвращает кол-во секунд с 1 января 1970 года, т.е. метку Unix для текущего момента.

Еще одна функция связанная с преобразованием даты имеет вид: int mktime(int hour, int minute, int second, int month, int day, int year[, int is_dst]). Думаю, что все аргументы кроме последнего не нуждаются в объяснении. Последний же указывает, действует ли переход на летнее время и обратно(1 - действуе, 0 - не действует, -1 (по умолчанию) - неизвестно). Этот аргумент не является обязательным, поэтому мы его не указали.

Если немного модифицировать постановку задачи, то можно разместить на своем сайте форму где пользователь указывает дату своего рождения и по нажатию кнопки получает свой возраст в годах, днях, …

Еще одна полезная функция, которую мы не использовали в программе, но которая может пригодится Вам в дальнейшем, имеет вид : array getdate(int timestamp). Как мы видим, ее аргументом является метка Unix, а возвращает функция ассоциативный массив, содержащий информацию о дате указанной в timestamp, если же аргумент timestamp не указан, то функция вернет информацию о текущем локальном времени.

Элементы массива:

Ключ Значение
(все значения, за исключением последних двух, имеют числовой формат)
seconds Секунды
minutes Минуты
Hours Часы
mday День месяца
wday День недели
mon Месяц
year Год
yday День года
weekday День недели (текстовый формат)
month Месяц (текстовый формат)

Получим с помощью функции getdate(), текущий день недели:

<?
$current_day = getdate();
echo "Сегодня $current_day[weekday]";
?>

На экране увидим:

Сегодня Sunday

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



 Desingn by Шишкин Алексей (Лёха).
 ©2004-2008 by sources.ru.