Php тип данных datetime

DateTime в PHP

Начиная с версии 5.2 в PHP появился такой тип данных как DateTime. Попробуем в этой статье разобраться почему лучше использовать его вместо старых функций date() и time().

Функция date() используется для строкового отображения даты/времени. Функция принимает два параметра, 1-ый — формат возвращаемой строки, а второй — само значение даты. По умолчанию второй параметр принимает значение текущего момента времени, либо можно указать отметку времени в unix формате (timestamp).

 // Текущая дата echo date("Y-m-d", time()); // 2013-12-01 echo date("Y-m-d", 1385925192);

Функция time() возвращает текущее время в unix формате (timestamp).

 // Текущее время, unix формат echo time();

Datetime()

Объект Datetime впервые был представлен в PHP версии 5.2, он содержит в себе множество вспомогательных объектов, для решения проблем, с которыми вам приходилось сталкиваться при использовании функций date() и time(). Также был представлен объект DateTimeZone, который управляет часовым поясом, объект DateInterval соответствует интервалу времени (например 2 дня) от настоящего момента, DatePeriod показывает разницу во времени между двумя разными датами. Основное преимущество использования DateTime перед старыми функциями заключается в том, что значения дат проще изменять. Если вы хотите получить значение времени и даты при помощи функции date(), то вы напишите следующее:

 echo date("l jS \of F Y h:i:s A");

А вот пример для установки часового пояса:

 date_default_timezone_set('UTC'); echo date("l jS \of F Y h:i:s A");

Проблема возникает при необходимости изменить или сравнить две отметки времени, DateTime имеет методы modify() и diff() упрощающие задачу. Преимущества DateTime проявляются когда вы манипулируете значениями дат.

Сначала объект надо инициализировать

Конструктор этого класса принимает два параметра. Первый — значение времени, вы можете использовать строку в формате функции date, время в формате Unix, интервал или период. Второй параметр — часовой пояс.

 // Установка даты $date = new DateTime('2000-01-01'); // Установка даты с часовым поясом $date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru')); // Установка даты на 4 дня вперед $date = new DateTime('+4 days');

Вывод форматированной даты

Объект DateTime может работать также как и функция date, всего лишь необходимо вызвать метод format() указав формат возвращаемой строки.

Вывод отметки времени (timestamp)

Для вывода отметки времени в формате Unix существует метод getTimestamp() .

$date = new DateTime(); echo $date->getTimestamp();

 ### Установка даты Несмотря на то, что значение даты вы указываете при создании объекта класса, вы можете позже изменять это значение. ### Изменение даты Для изменения даты используйте метод `setDate()`. ~~~php setDate(2001, 2, 3); echo $date->format('Y-m-d');

Изменение времени

Для изменения значения времени существует метод setTime() .

 $date = new DateTime(); // 2013-12-01 14:55:00 $date->setTime(14, 55); echo $date->format('Y-m-d H:i:s');

Изменение метки timestamp

Для этого придуман метод setTimestamp() .

 $date = new DateTime(); // 2013-11-28 19:13:19 $date->setTimestamp(1385665999); echo $date->format('Y-m-d H:i:s');

Установка часового пояса

Второй параметр при создании объекта — DateTimeZone, он позволяет назначить часовой пояс нашему объекту. Это означает, что мы сможем легко сравнивать два значения времени из разных часовых поясов и получать корректную разницу.

 // 2013-12-01 13:45:00+13:45 $date = new DateTime('2013-12-01', new DateTimeZone('Pacific/Chatham')); echo $date->format('Y-m-d H:i:sP');

Также для установки этого значения существует метод setTimezone() .

 $date = new DateTime('2013-12-01'); // 2013-12-01 13:45:00+13:45 $date->setTimezone(new DateTimeZone('Pacific/Chatham')); echo $date->format('Y-m-d H:i:sP'); // 2013-11-30 19:00:00-05:00 $date->setTimezone(new DateTimeZone('America/Toronto')); echo $date->format('Y-m-d H:i:sP');

Полный список часовых поясов можно просмотреть на php.net.

Как добавить дни к значению даты

Для изменения значения даты в объекте DateTime можно использовать метод modify(). Он принимает в качестве параметра строковое значение дней, месяцев, года. Например, если хотите прибавить несколько дней, например 3 дня, один месяц и один год:

 $date = new DateTime('2013-12-01'); $date->modify('+3 day'); // 2013-12-04 echo $date->format('Y-m-d'); $date = new DateTime('2013-12-01'); $date->modify('+1 month'); // 2014-01-01 echo $date->format('Y-m-d');

Сравнение двух дат

 $date1 = new DateTime('May 13th, 1986'); $date2 = new DateTime('October 28th, 1989'); $difference = $date1->diff($date2);

Код выше даст нам разницу двух дат в виде DateInterval.

DateInterval Object ( [y] => 3 [m] => 5 [d] => 15 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 1264 )

Конвертация номера месяца и имени месяца

Довольно часто приходится получать имя месяца из его порядкового номера, для этого всего лишь нужно указать формат “F” в качестве первого параметра

 $monthName = date("F", mktime(0, 0, 0, $monthNum));

При использовании класса DateTime можно применить метод format() .

 $date = new DateTime('2000-'.$monthNum.'-01'); $monthName = $date->format("F");

Получаем количество недель в месяце

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

 function weeks_in_month($month, $year)  $startDate = new DateTime(); $startDate->setDate($year, $month, 1); $loopDate = $startDate; $week = 1; for($i = $startDate->format('d'); $i  cal_days_in_month(CAL_GREGORIAN, $month, $year); $i++)  if($loopDate->format('w') % 7 == 0)  $week++; > $loopDate->modify('+1 day'); > return $week; > echo '

Jan '.weeks_in_month(1, 2014).'

'
; echo '

Feb '.weeks_in_month(2, 2014).'

'
; echo '

Mar '.weeks_in_month(3, 2014).'

'
; echo '

Apr '.weeks_in_month(4, 2014).'

'
; echo '

May '.weeks_in_month(5, 2014).'

'
; echo '

Jun '.weeks_in_month(6, 2014).'

'
; echo '

Jul '.weeks_in_month(7, 2014).'

'
; echo '

Aug '.weeks_in_month(8, 2014).'

'
; echo '

Sep '.weeks_in_month(9, 2014).'

'
; echo '

Oct '.weeks_in_month(10, 2014).'

'
; echo '

Nov '.weeks_in_month(11, 2014).'

'
; echo '

Dec '.weeks_in_month(12, 2014).'

'
; ?>

Читайте также

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

Как установить библиотеку ncurses для PHP yum install ncurses-devel phpize —clean phpize ./configure (./configure —with-php-config=/usr/bin/php-config —enable-ncursesw=autodetect —with-ncurses) make make install ls /usr/lib/php/modules/ncurses.so nano /etc/php.d/ncurses.ini extension=ncurses.so php…

Цвета терминала и управление вывода с sh и php echo Иногда, когда пишешь терминальное приложение (миграции например), хочется кроме стандартного потока, создавать более красочные сообщения и прогресс-бары. Для этого надо использовать управляющие…

Источник

PHP DateTime: Create, Compare and Format Dates Easily

a clock

When I search and read code about time and date problems developers have, I noticed that a lot of people still use the old PHP functions like date() , time() or strtotime() .

What about using the class DateTime instead?

DateTime can do all the usual date and time operations you could ask for, and even more. Using DateTime can save a lot of time when you have to do simple, or more complex operations on dates.

Now I see you asking: why using DateTime instead of a bunch of PHP date functions?

  • DateTime is definitely more robust to use. Less bug is always better.
  • DateTime is a class. You can use composition to modify his behavior easily. You need always the same date as input for your unit tests? Use your own instance of DateTime which always return the birthday of your dog!
  • Using one class is easier to understand for your fellow developer colleagues. Even if they don’t know DateTime , they just have to look to the documentation for one single class. It is definitely better than looking for a bunch of independent functions.

DateTime Instantiation and Formatting

The instantiation is easy: you can pass to the constructor a date correctly formatted, or nothing if you want to use the actual date and time.

Here the list of supported date and time formats you can inject in the constructor.

You can then format the date in order to display it, in two lines of code:

Output: whatever the current date is, correctly formatted.

Easy, isn’t it? You can as well precise the timezone you want as a second argument:

You want to format an unreadable timestamp into a nice and shiny easy-to-read date?

Obviously you can as well output a timestamp if you need to:

Adding or Subtracting Time

What about adding or retrieving a day, a minute, an hour of a date? You only need to use the proper formatting:

You can as well use the constructor if you work on the current date:

Output the current date plus one day.

For the same result, you could as well instantiate the class DateInterval but you would have to use an interval specification which is way harder to read.

I never use this last solution personally, simply because I never need to.

Interval Between Different Dates

It’s very easy to use DateTime classes to compare dates:

In this example we created two DateTime objects. They will receive two different dates in their constructors.

In order to compare those two dates we use the method diff() of the first DateTime object with the second DateTime object as argument.

The diff() method will return a new object of type DateInterval . If you want to format the difference between the two dates, you can use as well the format() method of the class DateInterval but be careful: it won’t accept the same formatting as the DateTime::format() method.

The output indicate that there is 1 day and 22 hours difference between the two dates.

If you only want the seconds, hours or day of interval you can write:

Comparing DateTimes

If you need to compare two instances of DateTime, it’s as simple as writing:

Output: datetime1 lesser than datetime2

Keep in mind that you need PHP 5.2.2 or greater for the comparisons to work. I really hope it’s the case!

You’re Now a Master of DateTime!

I invite you to read the PHP documentation about the class DateTime. You will never have to mess around with multiple functions and you will simplify your code a big time. Your colleague will praise you and your skills till the end of time.

Glory and fame will be at your door!

If you know other tricks and techniques with DateTime , feel free to share your knowledge in the comment section.

Источник

Класс DateTime

DateTime::ATOM DATE_ATOM Atom (пример: 2005-08-15T15:52:01+00:00) DateTime::COOKIE DATE_COOKIE HTTP Cookies (пример: Monday, 15-Aug-2005 15:52:01 UTC) DateTime::ISO8601 DATE_ISO8601 ISO-8601 (пример: 2005-08-15T15:52:01+0000) DateTime::RFC822 DATE_RFC822 RFC 822 (пример: Mon, 15 Aug 05 15:52:01 +0000) DateTime::RFC850 DATE_RFC850 RFC 850 (пример: Monday, 15-Aug-05 15:52:01 UTC) DateTime::RFC1036 DATE_RFC1036 RFC 1036 (пример: Mon, 15 Aug 05 15:52:01 +0000) DateTime::RFC1123 DATE_RFC1123 RFC 1123 (пример: Mon, 15 Aug 2005 15:52:01 +0000) DateTime::RFC2822 DATE_RFC2822 RFC 2822 (пример: Mon, 15 Aug 2005 15:52:01 +0000) DateTime::RFC3339 DATE_RFC3339 Тоже, что и DATE_ATOM (начиная с версии PHP 5.1.3) DateTime::RSS DATE_RSS RSS (пример: Mon, 15 Aug 2005 15:52:01 +0000) DateTime::W3C DATE_W3C World Wide Web Consortium (пример: 2005-08-15T15:52:01+00:00)

Список изменений

Версия Описание
5.5.0 Класс теперь реализует DateTimeInterface.
5.4.24 Константа COOKIE изменена, чтобы соответствовать RFC 1036, где используются 4 цифры года вместо двух (RFC 850), как было в предыдущих версиях.
5.2.2 Результаты сравнения DateTime объектов при использовании операторов сравнения теперь соответствуют смыслу этих операторов. Ранее все объекты считались равными (==).

Источник

Читайте также:  Узнать количество потоков python
Оцените статью