Объектно ориентированный подход при работе с датой

Все мы раньше так или иначе использовали в PHP функцию date() для произведения необходимых манипуляций с датой. Она прекрасна и решает множество задач, но увы иногда, когда очень хочется использовать объектный подход, она выпадает. Существует множество пользовательских решений, которые представляют классс-оболочку Date для функции date(), что решает вопрос. Но как мы знаем в 5.2 версии языка наконец-то сообразили сделать встроенный родной класс, и имя ему DateTime. В общем-то был добавлена целая группу классов работы с датой, но DateTime – основной, поэтому его мы и разберем.

Для тех кто работал с объектом Date на Javascript думаю будет проще перейти на DateTime. Начнем с начала – создадим объект:

$oDate = new DateTime;

можно как оставить конструктор без параметров, так и задать необходимое значение:

$oDate = new DateTime('2012-09-02 11:48:15');

тут есть особенность: есть мы хотим указать время через unixtime – то должны переди ставить значок “@”:

$oDate = new DateTime('@1346586632');

Итак мы создали объект даты $oDate и теперь мы конечно захотим вывести его. Для этого есть специальный метод format(). Синтаксис аналогичен date():

echo $oDate->format('Y-m-d H:i:s');

Встроенного магического метода __toString() почему-то не сделали, думаю можем сами расширить, если постоянно необходимо выводить один и тот же формат даты:

class CDateTime extends DateTime{
  function __toString() {
    return $this->format('Y-m-d H:i:s');
  }
}

Тогда может будет просто вывести:

echo $oDate;

Что еще есть полезного в этом объекте? Еще есть 2 метода, которые позволяют удобно прибавлять и отнимать определенный временной промежуток:

$oDate->add(DateInterval::createFromDateString('10 days'));
$oDate->sub(DateInterval::createFromDateString('2 month'));

Вот таким способом мы прибавили 10 дней и отняли 2 месяца. Здесь стоит уделить внимание объекту нового для нас класса DateInterval, которые необходим для задания временного интервала. Создать мы его можем разными способами:

  • через метод createFromDateString
  • через параметр конструктора

Вот некое соответствие между ними:

параметр createFromDateString параметр конструктора
1 day P1D
2 weeks P2W
3 months P3M
4 years P4Y
1 year + 1 day P1Y1D
1 day + 12 hours P1DT12H
3600 seconds PT3600S

После создания данного объекта мы можем его менять обращаясь непосредственно к переменным:

$interval = DateInterval::createFromDateString('2 month');
$interval->h = 10; //задали значение часов

Очень интересно что вывод значения объекта осуществляется также через метод format(), [!Внимание] синтаксис для задания формата отличается от DateTime, и тут многие делают ошибку. Символы обозначения разрядов остались такие же(Y – год, m – месяц), но теперь перед каждым нужно добавлять значок “%”:

echo $interval->format('%Y years %m months %d days %H hours ...');

Оставшиеся функции, которые могут быть интересны:

DateTime::modify ( string $modify ) – по синтаксису функции strtotime()
DateTime::diff ( DateTime $datetime2) – вычисление расхождений дат

Также класс содержит константы необходимых форматов, например:

echo DateTime::W3C; //'Y-m-d\TH:i:sP'

 

По основному все. Если кто-то знает еще какую либо полезную информацию о использовании объекта DateTime – пишите.