Php как получить текущую дату и время. Первый 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 date (" j F Y ") ;
echo "Текущее время" ;
echo date (" H: i: s ") ;
?>

Все текстовые элементы предназначенные для вывода, необходимо заключать в кавычки. Текстовые строки можно заключать как в одинарные, так и в двойные кавычки, в чём разница мы поговорим позже. Записи:

echo "Сегодня " ;

echo "Сегодня " ;

полностью эквивалентны и отобразятся одинаково.

Символ пробела перед закрывающей кавычкой используется для того, чтобы отделить вывод функции date от окружающего текста. Все команды в PHP всегда отделяются точкой с запитой.

Для вывода Даты и Времени на сайте, подставьте код Листинга 1 или Листинга 2 в нужное место своей web-страницы. Для придания надписям (Даты и Времени) общего стиля оформления сайта, можно воспользоваться.

P.S. Напоминаю, что файл в котором Вы размещаете PHP вставки должен иметь засширение .php и кроме того хостинг на котором "живет" Ваш сайт, должен поддерживать PHP (на сегодняшний день - это практически все

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