Ваш возраст на 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 обладает мощными инструментами по работе с календарем. И хотя набор функций получения и преобразования дат в этом языке рассмотрен далеко не полностью, надеюсь, все же данная статья поможет Вам написать немало интересных и полезных программ.
|