Войти Регистрация

PHP Дата и Время – используем ООП для работы с датой и временем


PHP расширение для работы с датой и временем, это набор классов, которые позволяют решать множество задач. Данные функции доступны начиная с 5.2 версии,  были представлены несколько классов, каждый из которых отображал сценарий реального времени:

- Дата и время представлялись с помощью DateTime объекта.

- Часовой пояс представлялся с помощью DateTimeZone.

- DateInterval объекты представляют интервал времени. Например, когда нам необходимо отсчитать 2 дня или часа от текущего времени. Этот объект не основывается на конкретном времени, это просто интервал.

- DatePeriod представляет период между двумя датами.

Теперь мы рассмотрим реальное применение вышесказанного.

Date() и DateTime

Если нам нужно получить дату, мы используем date(), это просто и работает. Всего лишь передать желаемый формат даты. Только это не совсем удобно на практике, например, когда необходимо изменять время в зависимости от временной зоны.

DateTime делает больше, нежели просто возвращает дату. Перед тем как это использовать необходимо инициировать новый DateTime объект. Делается это как и  в любом другом PHP классе:

$date = new DateTime();

Конструктор DateTime принимает строку как параметр, на данный момент строка пустая, установлена текущая дата и время по умолчанию.

Для создания определенной даты, необходимо передать условие для конструктора. Ниже можете увидеть некоторые из них, которые весьма понятны:

new DateTime('2013, March 24') //DateTime отобразит 24 марта 2013
new DateTime('2013-03-24') //DateTime отобразит 24 марта 2013
new DateTime('+2 days') // 2 день начиная от сегодняшнего
new DateTime('tomorrow') // завтрашний день

Полный список доступных форматов можно найти в официальной документации.

Если не найдете подходящий формат времени, вы можете определить его сами с помощью DateTime::createFromFormat.

DateTime::createFromFormat('j-M-Y', '24-Mar-2013');

Теперь, когда мы держим в руках готовый DateTime объект, мы можем делать много интересных вещей.

Временной штамп Unix

$date->getTimestamp();

Изменение Даты и Времени

$date->setDate(2013, 12, 30); //гггг, мм, дд установит определенную дату
$date->setTime(12, 3, 20); //чч, мм, сс (опционально) установит время
$date->modify('tomorrow'); // завтра можно задать даже так!
$date->setTimestamp(1364798550); // установка даты и времени используя unix штамп

Стоит заметить, если передаем параметры выше допустимых, PHP автоматически изменит их в соответствии. Например, $date->setDate(2013, 12, 35); возвратит 2014-01-04, то же самое и для время.

Работа с несколькими датами

Теперь, когда вы осведомлены с DateTime, ваши приложения будут сложены проще и грамотнее. Надеемся теперь вы любите даты более чем когда либо.

Сейчас мы рассмотрим работу с некоторыми математическими вычислениями. Скажем, нам необходимо сравнить две даты рождения:

$sheldon = new DateTime('May 20th, 1980');
$neo     = new DateTime('March 11th, 1962');
 
if ($sheldon > $neo)
    echo 'Sheldon моложе нежели neo';

Это можно сделать с помощью другого сценария. Вот так:

$diff = $neo->diff($sheldon);

Вызов функции diff возвращает DateInterval объект. Вот как он выглядит:

DateInterval Object
(
    [y] => 18
    [m] => 2
    [d] => 9
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 6645
)

Это public свойства. Вы можете генерировать интересные штуки на основании этого объекта.

//Neo старше на 18 лет и 2 месяца

$diff->format('Neo старше на %Y лет и %m месяцев'); 

Самое полезное, то что можно применить DateInterval объект к другому аналогичному DateInterval объекту.

$neo->add($diff); //день рождения neo изменен на sheldon

Заметьте: Модификация DateTime, например как в случае высше, не возвращает новый объект, просто видоизменяет прежний. Держите это во внимании когда работаете со своим приложением. PHP 5.5 представил новый класс, который возвращает новый объект после модификации.

Diff это не единственный способ получить объект интервала. Так как это класс, новый объект может быть создан как обычно:

$new_diff = new DateInterval('P2Y');

Передается в конструктор количество лет, месяцев, дней и т.д. Более информации можно найти в документации о конструкторе.

Работа с часовыми поясами

Когда создаем новый DateTime объект, второй аргумент определяет часовой пояс. Если мы упустим этот аргумент, временная зона будет взята с php.ini date.timezone. Вы можете изменять это на лету с помощью вызова date_default_timezone_set:

date_default_timezone_set('America/New_York');
new DateTime('today'); //datetime объект изменен на часовой пояс Нью Йорка

Вы также можете изменять часовой пояс  с помощью объекта DateTimeZone:

$timezone = new DateTimeZone('America/New_York');
$sheldon->setTimezone($timezone); //день рождения Шэлдона по времени в New York

Можно определять временную зону в процессе создания DateTime объекта:

$sheldon = new DateTime('May 20th, 1980', $timezone);

Важно помнить, что setTimezone изменяет оригинальный объект DateTime. Мы запрашиваем изменить данную дату в соответствии с временной зоной. С другой стороны, в последнем примере, мы передали временную зону в конструктор, говоря: «Дата которую я создаю, находится в этой временной зоне».

Список доступных часовых поясов доступен в документации.

Периоды даты и времени

Думаю, официальная документация предоставляет наиболее понятные объяснения:

Позволяет перемещаться в заданном временном интервале на равные промежутки времени.

DatePeriod генерирует коллекцию времен в определенном диапазоне, через заданные интервалы. Нам нужно передать стартовую дату, интервал и конечную дату. На каждый интервал создается новый объект DateTime.

Предположим, что мы хотим получить все дни рождения Шэлдона, начиная с его рождения:

//так как дни рождения раз в год, интервал будет один год
$interval = new DateInterval('P1Y');
 
//третий аргумент конечная дата, new DateTime() == сейчас
$period   = new DatePeriod($sheldon, $interval, new DateTime());
 
foreach($period as $dt) {
    //DateTime объект
    echo $dt->format('Y-m-d - D'), "\n";    
}

Результат будет следующим:

1981-05-20 - Wed
1982-05-20 - Thu
1983-05-20 - Fri
1984-05-20 - Sun
1985-05-20 - Mon
1986-05-20 - Tue
...

Сейчас периоды вмещают стартовую дату также. Можно исключить ее, передав четвертый аргумент в конструктор:

$period   = new DatePeriod($sheldon, $interval, new DateTime(), DatePeriod::EXCLUDE_START_DATE);

Давайте посмотрим, сколько раз Neo праздновал день рождение еще до рождения Шэлдона:

$bdays   = new DatePeriod($neo, $interval, $sheldon, DatePeriod::EXCLUDE_START_DATE);
echo iterator_count($bdays);

Расширение

Все классы, которые мы рассмотрели сегодня, могут быть расширены с помощью собственных методов. Самый распространенный способ создавать функцию __toString, которая позволит отображать DateTime объект без вызова format.

Что еще?

Как видите, это расширение даты и времени предлагает большие возможности. В последних версиях PHP есть новые классы, достаточно взглянуть в документацию.

У вас есть хорошие примеры использования даты и времени в PHP? Поделитесь ими в комментариях ниже! Всем спасибо за чтение.


Источник материала ...

Дальше: Анализ сайтов конкурентов самостоятельно, за 60 секунд


Дискуссия по теме     0 Комментариев
Добавить комментарий
Просмотров: 6645