Дата и время в PHP

В этой статье мы будем учиться работать с датами и временем в языке программирования PHP.

Дата и время в PHP
Дата и время в PHP

Преобразование даты в timestamp

Рассмотрим методы преобразования даты в метку времени (timestamp) в PHP.

Использование функции strtotime()

Встроенная функция strtotime() преобразует дату во временную метку Unix. Временная метка Unix — это общее количество секунд, отсчитываемое от эпохи Unix (1 января 1970 года). Правильный синтаксис для использования этой функции следующий:

strtotime($dateString, $timeNow);

Эта функция имеет два параметра. $dateString — это строка даты/времени, которая должна соответствовать допустимому формату PHP. Это обязательный параметр. Другой параметр $timeNow является необязательным, это метка времени, которая используется для вычисления относительных дат. Текущее время now является значением по умолчанию, если второй параметр опущен.

<?php
$timestamp = strtotime("23-04-2020");
echo "The timestamp is $timestamp.";

Дата здесь представлена в формате "d-m-Y". Мы передали только один параметр, так как он преобразует date в Unix timestamp (временную метку Unix).

Вывод:

The timestamp is 1587600000.

Использование функции strptime()

Это еще одна функция для преобразования даты в timestamp Unix. Она не преобразует date непосредственно в timestamp. Она возвращает массив, в котором указаны секунды, минуты, часы и некоторые другие данные. Мы можем использовать эти данные для преобразования date в timestamp.

strptime($dateString, $format);

Она имеет два обязательных параметра. $dateString — это строка даты, а $format — формат для парсинга $dateString.

<?php
$array = strptime('23-04-2020', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $array['tm_mon']+1, $array['tm_mday'], $array['tm_year']+1900);
echo "The timestamp is $timestamp.";

Вывод:

The timestamp is 1587600000.

После создания массива функция mktime() преобразует date в timestamp.

Синтаксис функции mktime() следующий:

mktime(hour, minute, second, month, day, year, is_dst)

is_dst определяет, является ли дата-время переходом на летнее время, но удален из PHP 7.0.0.

Предупреждение!

Мы прибавим 1 к $array['tm_mon'] и затем используем сумму в качестве параметра month в mktime, поскольку $array['tm_mon'] начинается с 0, или, другими словами, $array['tm_mon'] января равен 0.

Использование функции getTimestamp()

Метод getTimestamp() объекта DateTime — это простой метод преобразования даты в timestamp. Он имеет другой способ представления date_timestamp_get(), который является представлением процедурного стиля.

$datetimeObject->getTimestamp();

Мы создадим объект Datetime для вызова этой функции. Это объектно-ориентированный стиль вызова функции.

<?php
$date = new DateTime('2020-04-23');
$timestamp = $date->getTimestamp();
echo "The timestamp is $timestamp.";

Объект $date класса Datetime вызвал метод getTimestamp() для преобразования date (даты) в Unix timestamp.

Вывод:

The timestamp is 1587600000.

Использование функции format()

Мы также можем использовать метод format() в DateTime для преобразования даты в метку времени. Этот метод имеет другое представление date_format(), которое является представлением функции format() в процедурном стиле.

$datetimeObject->format("U");

Чтобы преобразовать дату в метку времени, формат, который мы передадим в виде строки, будет "U".

<?php
$dateObject = new DateTime('2020-04-23');
$timestamp = $dateObject->format("U");
echo "The timestamp is $timestamp.";

Объект $dateObject класса Datetime вызвал функцию format() для преобразования даты в временную метку Unix.

Вывод:

The timestamp is 1587600000.

Последний день месяца в PHP

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

Функции DateTime и strtotime наиболее полезны в этом сценарии, хотя хорошо известно и документировано, что strtotime не будет работать точно или давать правильные результаты после 2038 года. Однако strtotime отлично подходит для преобразования дат.

Обе функции используют формат t, который, согласно официальному руководству, возвращает количество дней в месяце от заданной даты. Обратите внимание, что ключом к получению последнего дня месяца является буква t, которая возвращает количество дней в данном месяце.

DateTime в PHP для получения последней даты месяца

Это лучший метод, который можно использовать для получения последней даты месяца как в будущем, так и в прошлом. Параметры, передаваемые в функцию format(), — Y, m и t. Эти константы определены в PHP.

Полное числовое представление года, состоящее из 4 цифр, обозначается буквой Y, например, 2020. Числовое представление месяца, с ведущими нулями, обозначается буквой m — это от 01 до 12. А количество дней в данном месяце обозначается буквой t.

Это лучший вариант, если используемая версия PHP старше 5.3.

$L = new DateTime( '2020-02-01' ); 
echo $L->format( 'Y-m-t' );

В приведенном выше коде функция DateTime получает дату и, используя символы формата Y-m-t, получает последнее число месяца в указанной дате.

strtotime() в PHP для получения последней даты месяца

strtotime() является лучшим вариантом для PHP версий до 5.2.

$date = "2020-01-15";
echo date("Y-m-t", strtotime($date));

Получение текущего года в PHP

Рассмотрим методы для получения текущего года, используя функцию date(), функцию strftime(), метод format() в объекте DateTime.

Использование функции date() для получения текущего года в PHP

Для получения текущего года мы можем использовать встроенную функцию date(). Она возвращает текущую дату с заданным форматом. Ее синтаксис выглядит следующим образом:

date($format, $timestamp);

Параметр $format говорит о конечном формате даты, который будет отображаться. Он имеет несколько вариаций. Он должен быть строкой.

Параметр $timestamp является необязательным. Он указывает конкретную временную метку и отображает дату соответствующим образом. Если временная метка не передана, то по умолчанию используется текущая дата.

<?php
$Date = date("d-m-Y");  
echo "The current date is $Date.";
echo "\n";
$Year = date("Y");
echo "The current year is $Year.";
echo "\n";
$Year2 = date("y");
echo "The current year in two digits is $Year2.";

Формат "d-m-Y" вернет полную дату с 4-значным значением года. Формат "Y" вернет 4-значное значение года. Формат "y" вернет 2-значное значение года. Вы можете изменить его в соответствии с вашими требованиями.

Вывод:

The current date is 20-04-2020.
The current year is 2020.
The current year in two digits is 20.

Использование функции strftime() для получения текущего года в PHP

Другая встроенная функция PHP — strftime() также может вернуть строку даты или времени в заданном формате. Она имеет другой формат для вариантов даты и времени.

strftime($format, $timestamp);

Параметр $format сообщает о формате даты или времени. Он представляет собой строку.

Параметр $timestamp является необязательной переменной, которая сообщает о временной метке UNIX. Это целое число. Если параметр не указан, функция возвращает текущую дату или время.

<?php
$Date = strftime("%d-%m-%Y");  
echo "The current date is $Date.";
echo "\n";
$Year = strftime("%Y"); 
echo "The current year is $Year.";
echo "\n";
$Year2 = strftime("%y"); 
echo "The current year in two digits is $Year2.";
Внимание! Мы можем получить текущий год в 4-значном значении, используя формат "%Y", и в 2-значном значении, используя формат "%y".

Вывод:

The current date is 20-04-2020.
The current year is 2020.
The current year in two digits is 20.

Использование объекта DateTime для получения текущего года в PHP

В PHP функция DateTime format() используется для отображения даты в заданном формате.

$ObjectName = new DateTime();
$ObjectName->format($format);

Параметр $format задает формат даты.

<?php
$Object = new DateTime();  
$Date = $Object->format("d-m-Y");  
echo "The current date is $Date.";
echo "\n";
$Year = $Object->format("Y"); 
echo "The current year is $Year.";
echo "\n";
$Year2 = $Object->format("y"); 
echo "The current year in two digits is $Year2.";

Вывод — дата с указанным форматом.

Вывод:

The current date is 20-04-2020.
The current year is 2020.
The current year in two digits is 20.

Преобразование DateTime в строку

Преобразовать DateTime в строку в PHP довольно просто, для этого существуют такие полезные функции, как format() класса DateTime, date_format(), использование предопределенных форматов или list().

Использование метода format() класса DateTime

В PHP есть класс DateTime для управления датой и временем. Он доступен с версии PHP 5.2.

Некоторые причины, по которым стоит использовать DateTime вместо традиционных функций PHP для управления датами:

  • Способен обрабатывать больше форматов строк
  • Проще, чем другие функции
  • Интерфейс инкапсулирует внутреннюю логику с чистым интерфейсом для использования

Одним из полезных методов класса DateTime является format(), он возвращает отформатированную строку даты в соответствии с заданным форматом.

Пример

$theDate = new DateTime('2020-03-08');
echo $stringDate = $theDate->format('Y-m-d H:i:s');

//output: 2020-03-08 00:00:00

$stringDate — это строка с заданным форматом.

Примечание. DateTime->format() на самом деле не поддерживает микросекунды.

Использование метода date_format()

Метод date_format() вернет новый объект DateTime и отформатирует его в соответствии с заданным форматом.

Пример

$date = date_create_from_format('d M, Y', '08 Mar, 2020');
echo $newFormat = date_format($date,"Y/m/d H:i:s");

//output: 2020/03/08 00:00:00

Согласно предоставленному формату, функция date_create_from_format() используется для парсинга строки времени. Эта функция принимает три параметра: format, time и timezone (необязательно).

В приведенном примере функция date_format() обрабатывает созданную дату для преобразования ее в строку.

Использование предопределенных форматов в файле date_d.php

Список предопределенных форматов:

define ('DATE_ATOM', "Y-m-d\TH:i:sP");
define ('DATE_COOKIE', "l, d-M-y H:i:s T");
define ('DATE_ISO8601', "Y-m-d\TH:i:sO");
define ('DATE_RFC822', "D, d M y H:i:s O");
define ('DATE_RFC850', "l, d-M-y H:i:s T");
define ('DATE_RFC1036', "D, d M y H:i:s O");
define ('DATE_RFC1123', "D, d M Y H:i:s O");
define ('DATE_RFC2822', "D, d M Y H:i:s O");
define ('DATE_RFC3339', "Y-m-d\TH:i:sP");
define ('DATE_RSS', "D, d M Y H:i:s O");
define ('DATE_W3C', "Y-m-d\TH:i:sP");

Пример

$dateFormat = new DateTime(); // this will return current date
echo $stringDate = $date->format(DATE_ATOM);

//output: 2020-03-08T12:54:56+01:00

В приведенном выше примере используется один из предопределенных форматов, поэтому нет необходимости предоставлять его.

Использование функции list()

Функция list() может быть использована для присвоения значений списку переменных за одну операцию, но работает только с числовыми массивами. Когда массиву присваивается несколько значений, первый элемент массива будет присвоен первой переменной, и так далее, до конца количества переменных. При этом количество переменных не может быть больше длины числового массива.

Пример

$date = explode("/",date('d/m/Y/h/i/s')
list($day,$month,$year,$hour,$min,$sec) = $date);
echo $month.'/'.$day.'/'.$year.' '.$hour.':'.$min.':'.$sec;

//output: 03/08/2020 02:01:06

Используя функцию list(), вы можете легко использовать $day, $month, $year, $hour, $min и $sec в качестве переменной.

Разница между двумя датами

Существует несколько способов вычисления разницы между двумя датами с помощью PHP. Я покажу, как вычислять разницу дат при использовании PHP версий младше 5.3 и более надежный метод для PHP версий старше 5.3.

Использование функции strtotime() для вычисления разницы между двумя датами для PHP версии ниже 5.3

Функция strtotime() преобразует две даты в UNIX-время и вычисляет по ним количество секунд. Исходя из этого, легче вычислять различные методы, использующие секунды. Функция принимает строковый параметр на английском языке, который показывает описание даты-времени.

Пример

$firstDate = "2019-01-01";
$secondDate = "2020-03-04";

$dateDifference = abs(strtotime($secondDate) - strtotime($firstDate));

$years  = floor($dateDifference / (365 * 60 * 60 * 24));
$months = floor(($dateDifference - $years * 365 * 60 * 60 * 24) / (30 * 60 * 60 * 24));
$days   = floor(($dateDifference - $years * 365 * 60 * 60 * 24 - $months * 30 * 60 * 60 *24) / (60 * 60 * 24));

echo $years." year,  ".$months." months and ".$days." days";

// выведет: 1 year, 2 months and 3 days
Справка. Функция abs() — возвращает абсолютное значение (модуль) числа.

В приведенном выше примере для получения разницы двух дат используется несколько функций, таких как abs(), floor() и, главным образом, strtotime().

Функция strtotime() получает значение секунд UNIX для дат и использует abs() для получения абсолютного значения первой даты.

Функция floor() используется для округления секунд до ближайшего целого числа.

Чтобы получить год, умножьте 365 дней на 60 минут, 60 секунд и 24 часа, затем разделите на разность.

Чтобы получить месяцы, умножьте 30 дней на 60 минут, 60 секунд и 24 часа и разделите на разность разности дат, умноженной на год и 365 дней, 60 минут, 60 секунд и 24 часа.

Затем, чтобы получить разницу дней, умножьте 60 минут, 60 секунд и 24 часа, затем разделите ее на разницу разницы дат, произведение года, 365 дней, 60 минут, 60 секунд и 24 часа и произведения месяцев, 30 дней, 60 минут и 60 секунд и 24 часа.

Наконец, сложите все это в переменную, чтобы вывести окончательную разницу.

Использование объектов DateTime() и DateInterval() для PHP 5.3 и старше

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

Пример

$firstDate  = new DateTime("2019-01-01");
$secondDate = new DateTime("2020-03-04");
$intvl = $firstDate->diff($secondDate);

echo $intvl->y . " год, " . $intvl->m." месяца и ".$intvl->d." день"; 
echo "\n";
// Общее количество дней
echo $intvl->days . " дней ";

// вывод: 1 год, 2 месяца и 1 день
//        428 дней

В приведенном примере, в отличие от использования функции strtotime() и других функций и вычислений, объекты DateTime() и DateInterval() упростили задачу.

Сначала объявляем даты с помощью new DateTime(). Затем получаем целочисленное значение разницы с помощью DateInterval() объекта diff() от первой даты и передаем вторую дату в качестве параметра.

И наконец, для получения года используем объект y. Для получения месяцев используем m, а для дня — d.

Опубликовано 12 января 2023 в 21:02
Обновлено 9 января 2024 в 14:12
Категория: Блог
Теги: