PHP 8.4: Date: 新增 DateTime(Immutable)::get/setMicroseconds 方法
PHP 8.4 及其此后的版本中, DateTime 和 DateTimeImmutable 类支持通过 getMicroseconds 和 setMicroseconds 方法获取和设置 DateTime/DateTimeImmutable 对象的秒数。
虽然可以使用时间戳创建/更新 DateTime 和 DateTimeImmutable 对象,但新方法允许设置微秒小数,而无需知道或修改小时、分钟、秒或日期和时间的其余部分。
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 类,并使用非兼容签名声明了同一个方法,该方法不会导致现有代码出现任何兼容性问题。