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
Метки: php
Спасибо, разобрался наконец с датами!