PHP 8.4: Новые методы DateTime(Immutable)::get/setMicroseconds
Хотя можно создавать/обновлять объекты DateTime и DateTimeImmutable с меткой времени, новые методы позволяют задавать доли микросекунд, не зная и не изменяя часы, минуты, секунды или остальные параметры даты и времени.
Метод setTime в классах DateTime и DateTimeImmutable позволяет задать значение микросекунды в качестве последнего параметра (int $microsecond). Микросекундную долю временной метки можно получить, отформатировав временную метку в формате u и принудительно преобразовав строковое значение в целое число.
Новые методы getMicroseconds и setMicroseconds
Новые методы getMicroseconds и setMicroseconds доступны в классах DateTime и DateTimeImmutable:
class DateTime {
// ...
public function getMicroseconds(): int {}
public function setMicroseconds(int $microseconds): static {}
// ...
}Для существующих объектов DateTime и DateTimeImmutable метод getMicroseconds возвращает микросекундную часть временной метки в виде целого числа:
// 2024-02-06 08:40:46.899561 UTC (+00:00)
$date = new DateTimeImmutable();
$date->getMicroseconds(); // (int) 899561Аналогично, метод setTimestamp принимает целочисленное значение для установки микросекундной части временной метки:
// 2024-02-06 08:40:46.899561 UTC (+00:00)
$date = new DateTime();
$date->setMicroseconds(426286);
$date->getMicroseconds(); // (int) 426286setMicroseconds принимаемые значения
Методы DateTime::setMicroseconds и DateTimeImmutable::setMicroseconds принимают целочисленное значение в диапазоне >= 0 и <= 999999. Это гарантирует, что установка доли микросекунд не приведёт к изменению секундной части временной метки.
Передача значения, выходящего за пределы этого диапазона, приводит к исключению DateRangeError.
$date = new DateTimeImmutable();
$date->setMicroseconds(1000000);DateRangeError: DateTimeImmutable::setMicroseconds(): Argument #1 ($microseconds) must be between 0 and 999999, 1000000 given.Существующие подходы для установки/получения микросекунд
Новые методы setMicroseconds и getMicroseconds — не единственный способ установить и получить значение микросекунд из объектов DateTime и DateTimeImmutable.
Самый простой подход — метод setTime, принимающий количество микросекунд:
$date = new DateTimeImmutable();
$date = $date->setTime(hour: 10, minute: 44, second: 0, microsecond: 628115);
$date->format('u'); // string(6) "628115"Недостатком этого подхода является то, что значения часа, минуты и секунды должны быть известны. В следующем фрагменте показана установка количества микросекунд при повторном использовании существующих значений даты, часа, минуты и секунды:
$date = new DateTimeImmutable();
$date = $date->setTime(
hour: (int) $date->format('G'),
minute: (int) $date->format('i'),
second: (int) $date->format('s'),
microsecond: 628115
);
(int) $date->format('u'); // int "628115"Новые методы setMicroseconds и getMicroseconds делают процесс интуитивно понятным, когда требуется только установить/получить значение микросекунды.
Влияние на обратную совместимость
Если пользовательский PHP-класс не расширяет классы DateTime или DateTimeImmutable и не объявляет те же методы с несовместимой сигнатурой, это изменение не должно вызвать проблем совместимости с существующим кодом.