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