[an error occurred while processing the directive]Ваш возраст на PHP[an error occurred while processing the directive]
Очень часто на страницах интернет-форумов встречаю вопросы касающиеся вычисления периода времени между заданными датами при помощи языка программирования 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");
?>
Выполнив скрипт, вы получите в браузере нечто подобное:
Теперь, будучи уверенными в собственных силах, усложним задачу. Высчитаем, сколько прошло лет, дней, часов, минут и секунд с момента Вашего рождения.
<? // Указываем дату и время Вашего рождения(для примера // возьмем 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 секунд."; ?>
Если все введено правильно, то Вы увидите на экране примерно следующее:
Обновляя страницу браузера, можно наблюдать как неумолимо приближается старость (или зрелость :)).
Небольшой комментарий к программе. Мы использовали фукцию 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]"; ?>
На экране увидим:
Думаю, я убедил Вас в том, что PHP обладает мощными инструментами по работе с календарем. И хотя набор функций получения и преобразования дат в этом языке рассмотрен далеко не полностью, надеюсь, все же данная статья поможет Вам написать немало интересных и полезных программ.
[an error occurred while processing the directive]