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