Новое в Symfony 6.4: DatePoint
- Pull Request: [Clock] Add DatePoint: an immutable DateTime implementation with stricter error handling and return types #51415 Nicolas Grekas
Работа с датами в PHP иногда может быть несколько странной. Например, если вы изменяете переменную DateTime
для создания новой даты, то исходная переменная также изменяется. Поэтому для решения этой проблемы в PHP был введён класс DateTimeImmutable
. К сожалению, этот класс также имеет свои особенности, например, при возникновении ошибки вместо выброса исключений возвращает false
.
Именно поэтому в Symfony 6.4 мы представляем DatePoint
— новый класс для работы с датами в PHP. Во-первых, этот класс расширяет DateTimeImmutable
, поэтому вы можете использовать его везде, где ожидается DateTimeImmutable
или DateTimeInterface
.
Во-вторых, этот класс легко интегрируется с компонентом Clock
, представленным нами в Symfony 6.2. Это означает, что если вы внесли какие-либо изменения в часы, то они будут отражены при создании новых экземпляров DatePoint
:
use Symfony\Component\Clock\DatePoint;
// получение текущего времени из даты/времени, определяемой Clock
$createdAt = new DatePoint();
// установка текущего времени в явном виде
$firstPubliCommitOfSymfony = new DatePoint('2005-10-18 16:27:36 Europe/Paris');
// использование текущего времени Clock, но с указанием часового пояса
$orderCreatedAt = new DatePoint(timezone: new \DateTimezone('UTC'));
// использование существующей даты в качестве ссылки для создания DatePoint
$welcomeDiscountValidUntil = new DatePoint('+1 month', reference: $user->getSignedUpAt());
Другое улучшение класса DatePoint
заключается в том, что ошибки (например, создание недопустимых дат или попытка модификации недопустимых дат) больше не возвращают false
, а выбрасывают \DateMalformedStringException
. Это исключение появилось в PHP 8.3, но благодаря полифиллу Symfony PHP 8.3 вы можете использовать его, начиная с PHP 7.1.
В целом, DatePoint
является полноценной заменой классов даты/времени PHP, предоставляющей множество утилит, полную интеграцию с компонентом Clock
и улучшенную обработку ошибок.