Очевидно, что очень часто программистам приходится работать с датой и временем . Самый простой пример - это дата и время отправки сообщения на форуме. И, разумеется, такие вещи могут реализоваться на PHP , тем более, что возможностей по работе с датой и временем в PHP очень много.
Базовая функция, связанная с датой и временем в PHP , - это функция time() , которая возвращает количество секунд, прошедших с полуночи 01.01.1970 (зарождение эпохи Unix ):
echo time();
?>
Запустив данный скрипт, Вы узнаете, сколько секунд прошло с полуночи 01.01.1970 до момента вызова функции time() в Вашем скрипте.
Разумеется, помимо этой базовой функции, которая присутствует во всех языках программирования, где можно работать с датой и временем (по крайней мере, среди тех, которые я знаю), существует и другая функция, которая называется getdate() :
$datetime = getdate();
foreach ($datetime as $k=>$v)
echo "$k - $v
";
?>
Запустив данный скрипт, Вы увидите набор ключей в массиве и их соответствующих значений (заодно, повторили конструкцию foreach ). Думаю, что теперь для Вас не составит труда узнать любые данные, связанные с датой и временем . Например, чтобы вывести текущее время, необходимо написать следующий код:
$datetime = getdate();
echo $datetime["hours"].":".$datetime["minutes"].":".$datetime["seconds"];
?>
Также у функции getdate() существует необязательный параметр, который означает количество секунд, прошедших с полуночи 01.01.1970 . Он сделан для того, чтобы эта функция могла возвращать не только текущие время и дату, а, вообще говоря, любые:
$datetime = getdate(152353232);
echo $datetime["year"];
?>
В результате, Вы увидите 1974-ый год.
Также существует функция date() . Я рекомендую посмотреть описание по ней в справочнике, так как данная функция принимает весьма сложный параметр, который задаёт формат вывода даты. Элементов форматирования чуть больше 30-ти штук. И в примере ниже я приведу несколько из них, а остальные посмотрите в справочнике, потому что их запоминать не нужно, но ознакомиться с ними крайне желательно. А принцип их использования знать обязательно, и о нём следующий пример:
echo date("Сегодня d.m.Y H:i:s");
?>
В результате, Вы увидите что-то наподобие этого: "Сегодня 15.11.2010 21:44:24 ". Также у функции date() есть ещё второй необязательный параметр, задающий timestamp , как раз та величина, равная количеству секунд, прошедших с полуночи 01.01.1970 . Пример использования второго параметра:
echo date("Когда-то было d.m.Y H:i:s", 5393235329);
?>
Также существует функция gmdate() , которая является полным аналогом функции date() , но функция gmdate() показывает время не по часовому поясу сервера, на котором работает скрипт, а по Гринвичу . Очевидно, что с помощью этой функции надо сохранять всю информацию о дате и времени, которую видит пользователь, а при выводе нужно подстраиваться под часовой пояс каждого пользователя (в идеале, конечно):
echo gmdate("Сейчас на Гринвиче D M j H:i:s T Y")
?>
В результате, Вы увидите примерно следующее: "Mon Nov 15 18:52:45 GMT 2010 ". Разумеется, у Вас будет выведена уже другая дата, но в аналогичном формате. Также я настоятельно рекомендую залезть в справочник и просто ознакомиться с другими элементами даты и времени в PHP (я привёл только треть), так как функции date() и gmdate() - это самый простой и самый быстрый способ получить дату и время в практически любом формате.
У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!
Представление даты и времени
В распределенных системах, таких, как Интернет, время играет особую роль. Из-за незначительного расхождения системных часов игрок на рынке Forex может потерять десятки тысяч долларов в течение нескольких минут; система деловой разведки ошибется в составлении прогноза; серверы NNTP в процессе синхронизации потеряют важную информацию, нужную пользователю и т.д.
PHP содержит множество функций для работы с датой и временем. Наиболее употребимыми являются:
- time() - возвращает текущее абсолютное время. Это число равно количеству секунд, которое прошло с полуночи 1 января 1970 года (с начала эпохи UNIX).
- getdate()
- считывает информацию о дате и времени. Возвращает
ассоциативный массив, содержащий информацию по заданному или по текущему
(по умолчанию) времени. Массив содержит следующие элементы:
Пример 1
Использование getdate() $val) echo "$key = $val
"; echo "
Сегодня: $d.$d.$d"; ?>РЕЗУЛЬТАТ ПРИМЕРА 1:
Seconds = 21 minutes = 4 hours = 12 mday = 10 wday = 4 mon = 11 year = 2005 yday = 313 weekday = Thursday month = November 0 = 1131613461 Сегодня: 10.11.2005
- date()
- форматирование даты и времени. Аргументы: строка формата
и абсолютное время. Второй аргумент необязателен. Возвращает строку с заданной
или текущей датой в указанном формате.
Строка формата может содержать следующие коды:
a A Включено обозначение "AM" или "PM" d День месяца (01-31) D Сокращенное название дня недели (три буквы) F Полное название месяца g Часы (12-часовой формат без ведущих нулей) G Часы (24-часовой формат без ведущих нулей) h Часы (12-часовой формат) H Часы (24-часовой формат) i Минуты (00-59) j День месяца без ведущих нулей (1-31) l Полное название дня недели L Признак високосного года (0 или 1) m Месяц (01-12) M Сокращенное название месяца (три буквы) n Месяц (1-12) s Секунды (00-59) t Количество дней в данном месяце (от 28 до 31) U Абсолютное время w y Год (два разряда) Y Год (четыре разряда) z День года (0-365) Z Смещение часового пояса в секундах (от -43200 до 43200) Любая другая информация, включенная в строку формата, будет вставлена в возвращаемую строку. Если в строку формата нужно добавить символы, которые сами по себе являются кодами формата, то перед ними надо поставить обратную косую черту "\". Символы, которые становятся кодами формата при добавлении к ним обратной косой, нужно предварять двумя косыми. Например, если необходимо добавить в строку "n", то надо ввести "\\n", поскольку "\n" является символом новой строки.
Пример 2
Использование date() РЕЗУЛЬТАТ ПРИМЕРА 2:
Сегодня: 10.11.05 13:03
- mktime()
- возвращает абсолютное время, которое затем можно
использовать с функциями date() или getdate() . Принимает до
шести целочисленных аргументов в следующем порядке:
Часы
минуты
секунды
месяц
день месяца
годПример 3
Использование mktime() РЕЗУЛЬТАТ ПРИМЕРА 3:
- checkdate()
- проверка правильности даты.
Аргументы: месяц, день, год. Возвращает true , если дата правильная,
т.е.
месяц - целое число от 1 до 12;
день - целое число, не превышающее общего количества дней в данном месяце. При этом високосные годы обрабатываются корректно;
год - целое число от 1 до 32767.Например:
If (!checkdate($month, 1, $year)) { $d = getdate(); $month = $d; $year = $d; }
Внимание! Дата может находиться в допустимом диапазоне, но остальные функции работы с датами не примут это значение. Так, нельзя использовать mktime() для годов до 1902, а также следует использовать ее осторожно для годов до 1970.
- strftime()
- формирование локальной даты и времени.
Аргументы: строка формата и абсолютное время. Второй аргумент необязателен.
Возвращает строку с заданной или текущей датой в указанном формате.
При этом названия месяцев и дней недели извлекается из локали,
выбранной с помощью функции
Строка формата может содержать следующие коды:
%a Сокращенное название дня недели %A Полное название дня недели %b Сокращенное название месяца %B Полное название месяца %c Предпочтительный формат даты и времени %C Номер века %d День месяца (1-31) %D То же, что и %m/%d/%y %e Месяц (1-12) %h То же, что и %b %H Часы (24-часовой формат) %I Часы (12-часовой формат) %j День года (0-365) %m Месяц (1-12) %M Минуты %n Символ новой строки %p Включено обозначение "am" или "pm" %r Время с использованием a.m./p.m.-нотации %R Время в 24-часовом формате %S Секунды (00-59) %t Символ табуляции %T То же, что и %H:%M:%S %u Номер дня недели (1 - понедельник, 7 - воскресенье) %U Номер недели. Отсчет начинается с первого воскресенья года %V Номер недели по ISO 8601:1988. Первая неделя должна иметь не менее четырех дней, а понедельник считается первым днем %W Номер недели. Отсчет начинается с первого понедельника года %w Номер дня недели (0 - воскресенье, 6 - суббота) %x Предпочтительный формат даты без времени %X Предпочтительный формат времени без даты %y Год (два разряда) %Y Год (четыре разряда) %Z Часовой пояс (имя или сокращение) %% Символ "%" Любая другая информация, включенная в строку формата, будет вставлена в возвращаемую строку.
Давайте рассмотрим часть кода из реальной web-странички, и создадим наш первый php-сценарий, а именно выведем дату и текущее время на нашем сайте. Этот сценарий применяется на сайтах достаточно часто и думаю будет полезен многим.
Создадим еще один php-файл и назовем этом файл time.php . мы изучали ранее, если подзабыли повторите.
Итак файл time.php мы создали и поместили этот файл в созданную ранее папку myphp по адресу . Эту тему мы изучали в уроке
Открываем код файла time.php и между тегами
и прописываем вот такой код, Листинг 1 :Листинг 1.
Сегодня:
|
Запускаем Локальный сервер, набираем в адресной строке браузера адрес http://localhost/myphp/time.php и нажимаем Enter . И видим на вот такую картинку:
Обращаю Ваше внимание, что в данном случае выводится текущее серверное время, т.е. если например сервер на котором "живет" Ваш сайт расположен в другой стране и текущее время отличается от Московского, то и выводимое значение времени тоже будет отличаться от Московского.
Давайте разберём код Листинга 1. Обычные текстовые надписи "Сегодня " и "Текущее время " не обрабатываются препроцессором PHP и выводятся как "есть". Вместо этих записей Вы можете написать любой текст, например просто Дата или Время и т.д.
А вот php-код заключенный в дескрипторы прежде чем отдаётся браузеру, проходит обработку PHP.
Как Вы наверное уже поняли функция date в PHP отвечает за вывод даты и времени . В круглых скобках указаны значения отображения даты и времени. В PHP таких значений очень много и этому разбору и изучению всех возможных значений, мы посвятим следующий отдельный урок.
Оператор echo - переводится как вывести , в данном случае имеется ввиду вывести на экран монитора Дату и Серверное Время .
Такого же результата (отображения в браузере) можно добиться разместив весь сценарий внутри PHP-дескрипторов. Смотрите Листинг 2 :
Листинг 2.
echo "Сегодня:" ;
|
Все текстовые элементы предназначенные для вывода, необходимо заключать в кавычки. Текстовые строки можно заключать как в одинарные, так и в двойные кавычки, в чём разница мы поговорим позже. Записи:
echo "Сегодня " ;
echo "Сегодня " ;
полностью эквивалентны и отобразятся одинаково.
Символ пробела перед закрывающей кавычкой используется для того, чтобы отделить вывод функции date от окружающего текста. Все команды в PHP всегда отделяются точкой с запитой.
Для вывода Даты и Времени на сайте, подставьте код Листинга 1 или Листинга 2 в нужное место своей web-страницы. Для придания надписям (Даты и Времени) общего стиля оформления сайта, можно воспользоваться.
P.S. Напоминаю, что файл в котором Вы размещаете PHP вставки должен иметь засширение .php и кроме того хостинг на котором "живет" Ваш сайт, должен поддерживать PHP (на сегодняшний день - это практически все
Работа с датой и временем в PHP относительно несложная. Наличие довольно большого количества функций делает код не таким громоздким (а в PHP 5.2 с появлением DateTime и в 5.3 с добавлением классов DateInterval и DatePeriod и отдельных методов - работа с датами стала ещё проще и удобнее). Итак, для работы с датой…Во-первых, в любом случае, следует иметь в виду, что:
- практически любое действие можно сделать несколькими способами;
- весь код написан для демонстрации и примеров работы;
- не всегда предложенный альтернативный результат может подходить при использовании более ранней версии PHP (иногда проще , чем править работающий код многолетней давности);
В PHP 5.3 для корректной работы с датой во избежание ошибок Strict Standarts . На сегодняшний день, как правило эта ситуация учитывается либо в скриптах, либо в настройках хостинга.
PHP преобразовать UNIX timestamp в дату в заданном формате
Одна из самых простых задач. Используется функция: date($format, $time)
Первым параметром передаём формат даты - подробнее см в документации (для “привычного нам” 28.02.2012 15:43:59
следует использовать:
date("d.m.Y H:i:s", $time)
PHP как узнать завтрашнюю/вчерашнюю дату
Тут тоже всё просто. Функцией time() получаем текущее время в формате UNIX Timestamp. Отнимаем (вчерашняя дата) или прибавляем (завтра) нужное количество секунд (86400 = 3600*24 - в сутках) и получаем:
$now = time(); // использовать не обязательно
$yesterday = time()-3600*24;
$tomorrow = time()+3600*24;
$weekBefore = time() - 3600*24*7; // неделю назад
echo "Вчера: ",date("d.m.Y", $yesterday),"
Завтра:",date("d.m.Y",$tomorrow);
PHP как получить дату с определённым сдвигом (на X дней раньше/позже)
Иногда требуется узнать дату, которая будет через несколько дней от указанной. Например, пользователь оплатил услугу 11 февраля 2013 года на 3 недели. Имеется информация об оплате. До какого числа оплачено?
Когда можно “просто” прибавить пару дней и получить 13 февраля - особых сложностей процедура не вызывает. Но как быть с разным количеством дней в месяце? Как быть с високосным годом? Всё уже придумано до нас - для вычисления даты по известному интервалу будем использовать mktime
$payment = array("day"=>11,"month"=>2,"year"=>2013);
$toDate = mktime(0,0,0,$payment["month"],$payment["day"]+3*7,$payment["year"]);
echo date("d.m.Y",$toDate); // вывод
// в PHP > 5.3 с использованием DateInterval
date_default_timezone_set("Europe/Moscow");
$datetime = new DateTime(date());
$datetime->sub(new DateInterval("P7D")); // минус 7 дней
PHP как посчитать разницу между датами
Казалось бы простая ситуация - есть две даты, посчитать количество дней (месяцев и дней) между ними. Однако, “ручная” реализация потребует некоторого времени, и есть шанс что-либо упустить (для спортивного интереса - желающие попробовать могут оставлять код в комментариях). В PHP для вычисления разницы между датами есть встроенная функция date_diff, или точнее Datetime::diff
$datetime1 = new DateTime("2013-05-01");
$datetime2 = new DateTime("2013-01-01");
$interval = $datetime1->diff($datetime2);
echo $interval->format("%R%a days after New Year");
PHP перевести DDD дней в X лет Y месяцев Z лет
Иногда требуется вывести время после определённого события. Например, после регистрации прошло. Для удобства (3200 дней мало о чём говорит) восприятия перевести в годы и месяцы можно используя форматирование DateInterval::format
$registerDate = new DateTime("2009-03-03");
$today = new DateTime();
$interval = $today->diff($registerDate);
echo "С момента регистрации прошло: ";
echo $interval->format("%a дней")."\n"; // общее количество дней
echo " или ";
echo $interval->format("%m месяцев, %d дней"); // месяцев, дней
PHP перевод из date в timestamp - разбор даты в русском формате
Иногда требуется перевести дату в формате, удобном для восприятия в формат UNIX TIMESTAMP Для разбора даты в формате ‘2013-05-30 12:35′ на составляющие (отдельно получить год, месяц, день) можно воспользоваться функцией date_parse. Для перевода сразу в unix timestamp - можно использовать strtotime (а также вариации вроде ‘now’, ‘+1 day’, ‘next Thursday’ - php.net/manual/en/datetime.formats.php):
echo strtotime("2013-05-30");
print_r (date_parse("2013-05-30 12:35"));
Однако, для России более привычный формат ДД.ММ.ГГГГ. Можно, конечно, разбить дату по символу точки, получить день, месяц, год и при помощи функции mktime узнать соответствующее значение UNIX TIMESTAMP. В PHP5.3 появилась функция date_parse_from_format, в которую можно передать строку с форматом. А для PHP5.2 я использовал strptime (о существовании которой, как выяснилось, не все догадываются, возможно, потому, что она банально не реализована для Windows: This function is not implemented on Windows platforms):
$date = "30.05.2013 12:35";
$format = "d.m.Y H:i";
print_r (date_parse_from_format($format,$date));
// альтернативный вариант для PHP5.2
$format = "%d.%m.%Y %H:%M"; // отличается от используемого в функции date
$d = strptime($date, $format);
$newDate = mktime($d["tm_hour"], $d["tm_min"], $d["tm_sec"],
$d["tm_mon"]+1, $d["tm_mday"], $d["tm_year"]+1900); // tm_mon 0-11, tm_year 1900
echo $newDate;
Кроме того, у функции strptime есть особенности - месяц сдвинут на единичку (Январь - 0), а год - это количество лет с 1900 года, т.е. для 2013 $d[’tm_year’] будет равно 113.
Ссылки и полезная информация:
PHP dateTime functions http://www.php.net/manual/en/ref.datetime.php - функции работы с датой
PHP class DateTime http://www.php.net/manual/en/class.datetime.php
PHP date_diff http://www.php.net/manual/en/function.date-diff.php
PHP strftime http://ru2.php.net/manual/en/function.strftime.php
PHP date_parse_from_format http://ru2.php.net/manual/en/function.date-parse-from-format.php