php работаем с датой - date DateTime mktime и другие…

Работа с датой и временем в PHP относительно несложная. Наличие довольно большого количества функций делает код не таким громоздким (а в PHP 5.2 с появлением DateTime[2] и в 5.3 с добавлением классов DateInterval и DatePeriod и отдельных методов - работа с датами стала ещё проще и удобнее). Итак, для работы с датой…Во-первых, в любом случае, следует иметь в виду, что:

  • практически любое действие можно сделать несколькими способами;
  • весь код написан для демонстрации и примеров работы;
  • не всегда предложенный альтернативный результат может подходить при использовании более ранней версии PHP (иногда проще устанавливать более раннюю версию PHP5.2, чем править работающий код многолетней давности);

В PHP 5.3 для корректной работы с датой во избежание ошибок Strict Standarts It is not safe to rely on the system’s timezone settings следует указать date.timezone. На сегодняшний день, как правило эта ситуация учитывается либо в скриптах, либо в настройках хостинга.

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.

Ссылки и полезная информация:
[1] PHP dateTime functions http://www.php.net/manual/en/ref.datetime.php - функции работы с датой
[2] PHP class DateTime http://www.php.net/manual/en/class.datetime.php
[3] PHP date_diff http://www.php.net/manual/en/function.date-diff.php
[4] PHP strftime http://ru2.php.net/manual/en/function.strftime.php
[5] PHP date_parse_from_format http://ru2.php.net/manual/en/function.date-parse-from-format.php

Метки:

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

1 комментарий к записи “php работаем с датой - date DateTime mktime и другие…”

  1. Tmara сообщает :

    Спасибо, разобрался наконец с датами!

Добавить комментарий