Php вывод текущей даты. Php работаем с датой - date DateTime mktime и другие…
Среди разнообразных задач программирования, различные манипуляции со значениями даты и времени встречаются достаточно часто. Редкая автоматизированная система, база данных может обойтись без сохранения информации о времени того или иного процесса. Помимо простейшего добавления даты в запись базы данных или отображения этой даты, встречаются множество задач вывода этих дат в различном виде, проверки соответствия текущего времени с заданным таймером, вычисление срока между двумя датами и многое другое.
Для удобства работы с датами каждый язык программирования имеет свои специальные типы данных для хранения значения даты и времени. Чаще всего это числовое значение, либо целое, либо с плавающей точкой.
В PHP работа с датой чаще всего сталкивается с UNIX TIMESTAMP. Здесь время хранится целым числом. Исчисление времени начинается с 1 января 1970 года. Поэтому, например, дата и время 11.12.2014 19:40:00, будет представлено числом 1418316000. Эта цифра показывает, сколько секунд прошло с нулевой даты 1 января 1970 года, названой Эпохой Unix.
Пример php-страницы, предоставляющий возможности преобразования данных представлен на сайте в разделе программ программой "Преобразование формата даты и времени" . Здесь можно сформировать нужную дату в формат UNIX TIMESTAMP, а так же привести этот формат в стандартный, понятный человеку вид.
Получение текущего времени и даты в PHP
Для получения текущего времени сервера используется функция
int time(void)
которая как раз вернет значение в формате unix timestamp.
echo time(); // вывод текущего времени в формате unix timestamp
На первый взгляд не очень удобный формат для человека, но, как известно, чем проще представление данных, тем быстрее выполняется обработка этих значений компьютером. Кроме того, хранение числа в базе данных намного экономичнее, чем какой-либо специальный формат. Так же, PHP работает со временем одинаково и на Unix и на Windows платформе, что обеспечивает возможность использовать код на любой из этих платформ.
Преобразование формата даты и времени в PHP
Простейший механизм, позволяющий преобразовать числовое значение даты на более понятные значения, предоставляется функцией:
array getdate()
Она возвращает ассоциативный массив, содержащий информацию о дате. Если параметр timestamp не указан, будут возвращены сведения о текущем времени. Этот массив содержит следующие значения:
Полученный массив, позволяет вывести значения нужном виде:
$date = 1418372345;
$date_mas = getdate($date);
echo
$date_mas["mday"
] . " . "
. $date_mas["mon"
] . " . "
. $date_mas["year"
]; // 12.12.2014
Так же для преобразования формата даты и времени можно воспользоваться функцией:
string date(string $template [, int $unix_timestamp])
Она предназначена для получения текущей даты unix timestamp в нужном формате. Строковый параметр $template определяет формат вывода. Параметром $unix_timestamp можно задать, с каким значением времени производится работа. Он необязательный, поэтому, если его не указать, будет использоваться текущая дата и время.
Формат задается следующими значениями:
a | "до" и "после" полудня: "am" или "pm" |
A | "до" и "после" полудня заглавными буквами: "AM" или "PM" |
d | день месяца 2 цифрами (если меньше 10, на первом месте ноль) (от 01 до 31) |
D | день недели 3 буквами. Например, "Mon" (понедельник) |
j | день месяца, 1-2 цифры без начальных нулей (от 1 до 31) |
F | название месяца. Например, "January" |
h | час, 12-часовой формат (от 01 до 12) |
H | час, 24-часовой формат (от 00 до 23) |
g | час, 12-часовой формат без нулей (от 1 до 12) |
G | час, 24-часовой формат без нулей (от 0 до 23) |
i | минуты (от 00 до 59) |
I (заглавная i) | 1, если действует переход на летнее время, иначе 0 |
L | 1, если год високосный, или 0 если не високосный |
B | время в формате Интернет-времени (альтернативной системы отсчета времени суток) (от 000 до 999) |
T | временная зона компьютера. Например, MDT |
l (строчная L) | день недели. Например, "Monday" |
m | месяц, две цифры с нулями (от 01 до 12) |
n | месяц, одна-две цифры без нулей (от 1 до 12) |
M | сокращенное наименование месяца. Например, "Jan" |
t | число дней в указанном месяце (от 28 до 31) |
s | секунды (от 0 до 59) |
S | англоязычный порядковый суффикс числа из двух букв ("st", "nd", "rd" или "th") |
U | целое число секунд, прошедших с момента начала эпохи UNIX |
y | год, цифровой, 2 цифры (14) |
Y | год, цифровой, 4 цифры (2014) |
z | порядковое число дня в году (от 0 до 365) |
Z | смешение временной зоны в секундах (от -43200 до 43200) |
N | порядковый номер дня недели от 1 (понедельник) до 7 (воскресенье) в соответствии со стандартом ISO-8601, (добавлен в версии PHP 5.1.0) |
w | порядковый номер дня недели от 0 (воскресенье) до 6 (суббота) |
W | порядковый номер недели года в соответствии со стандартом ISO-8601; недели начинаются с понедельника (добавлено в версии PHP 4.1.0) |
o | номер года в соответствии со стандартом ISO-8601. Имеет то же значение, что и Y, кроме случая, когда номер недели ISO (W) принадлежит предыдущему или следующему году; тогда будет использован год этой недели. (добавлен в версии PHP 5.1.0) |
e | код шкалы временной зоны. Например: UTC, GMT, Atlantic/Azores (добавлен в версии PHP 5.1.0) |
O | разница с временем по Гринвичу, в часах. Например: +0200 |
P | разница с временем по Гринвичу с двоеточием между часами и минутами. Например: +02:00 (добавлено в версии PHP 5.1.3) |
c | дата в формате стандарта ISO 8601. Например, 2014-12-12T15:19:21+00:00 (добавлено в PHP 5) |
r | дата в формате » RFC 2822. Например: Thu, 21 Dec 2000 16:01:07 +0200 |
U | количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970 00:00:00 GMT) |
Как видно из списка, с помощью этой функции можно получить очень много полезных данных о дате. Например:
$date = 1418372345; // исходное дата и время 12.12.2014 11:19:05
echo
date("d.m.Y"
, $date); // 12.12.2014 (дата)
echo
date("H:i:s"
, $date); // 11:19:05 (время)
echo
date("H:i"
, $date); // 11:19 (время)
echo
date("t"
, $date); // 31 (число дней в месяце)
echo
date("z"
, $date); // 345 (порядковый номер дня в году)
echo
date("l dS \of F Y h:i:s A"
, $date); // Friday 12th of December 2014 11:19:05 AM
Другие символы, входящие в шаблон, будут выведены в строке как есть. Если же потребуется ввести символ, который используется в функции как код формата, перед ними вставляется символ "\". Для значения "\n" (символ перехода на новую строку), следует указать "\\n". Таким образом, можно делать вывод целого сообщения, содержащего сведения о дате и времени:
echo date("Сегодня z-й день Y-го года" , $date); // Сегодня 345-й день 2014-го года
Преобразование даты и времени в формат timestamp
Для обратного преобразования даты из стандартного формата в числовое значение timestamp применяется функция:
int mktime(]]]]]])
Функция mktime() возвращает значение времени Unix, соответствующую дате и времени, заданным аргументами. Например:
$my_date = mktime (10, 30, 0, 12, 12, 2014);
Следует внимательно относится к порядку аргументов функции: часы, минуты, секунды, месяц, день, год.
Кроме простого формирования значения даты в timestamp, функцию mktime() можно использовать для арифметически вычисления с датами. Для этого просто можно ввести необходимые аргументы. Например, если указать 14 месяц, то в итоговом значении, месяц будет 2-й, а значение года увеличится на единицу:
$my_day = 12;
$my_month = 12;
$my_year = 2014;
$new_date = mktime(0, 0, 0, $my_month + 5, $my_day, $my_year);
echo
date("d.m.Y"
, $new_date); // 12.05.2015 (дата)
Аналогично можно поступать и с другими параметрами.
Проверка корректности даты в PHP
При работе с датами, особенно при формировании даты предложенной выше функцией mktime() необходимо учитывать корректность вводимой даты. Для этого в PHP используется функция:
bool checkdate(int month, int day, int year)
Возвращает true если дата, заданная аргументами, является правильной; иначе возвращает false. Дата считается правильной, если:
Год в диапазоне от 1 до 32767;
Месяц в диапазоне от 1 до 12;
День для заданного месяца с учетом високосного года указаны правильно.
Пример проверки даты:
$my_day = 32;
$my_month = 12;
$my_year = 2014;
if
(!checkdate($my_month, $my_day, $my_year))
echo
"Ошибка: дата указана некорректно"
;
Давайте рассмотрим часть кода из реальной 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
У Вас в браузере заблокирован 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 Часовой пояс (имя или сокращение) %% Символ "%" Любая другая информация, включенная в строку формата, будет вставлена в возвращаемую строку.