编程

PHP 8.4: Date: 新增 DateTime(immutable)::createFromTimestamp 方法

784 2024-01-13 16:05:00

PHP 8.4 中的 DateTimeDateTimeImmutable 类有一个名为 createFromTimeStamp 的新方法,用于从给定的 UNIX 时间戳(作为整数或浮点数)创建实例。

PHP 8.4 之前,从 UNIX 时间戳中创建 DateTime,必须使用 createFromFormat 创建,通过 U / U.u 格式、@<timestamp> 格式或者在已经实例化的方法中调用 setTimestamp

新增的 DateTime::createFromTimeStampDateTimeImmutable::createFromTimeStamp 方法使得从 UNIX 时间戳创建 DateTime 或者 DateTimeImmutable 实例更加方便快速。

$dt = DateTimeImmutable::createFromTimeStamp(1703155440);
$dt->format('Y-m-d'); // "2023-12-21"
$dt = DateTimeImmutable::createFromTimeStamp(1703155440.628);
$dt->format('Y-m-d h:i:s.u'); // "2023-12-21 10:44:00.628000"

createFromTimeStamp 方法摘要

class DateTime {
    // ...
    public static function createFromTimestamp(int|float $timestamp): static {}
}

class DateTimeImmutable {
    // ...
    public static function createFromTimestamp(int|float $timestamp): static {}
}

值得注意的是,createFromTimestamp 方法接受 intfloat 值。这意味着可以创建微秒级精度的实例。并不是所有现有的方法都支持微秒级的精度。

现有方法

有几种可能的方法可以创建或修改带有 UNIX 时间戳的 DateTimeDateTimeImmutable 实例。并非所有以下方法都支持浮点值,这意味着并非所有方法都支持微秒精度。

DateTime(Immutable)::createFromFormat 使用 U / U.u 格式

DateTime::createFromFormatDateTimeImmutable::createFromFormat 方法支持将给定值作为格式化为指定格式创建 DateTimeDateTimeImmutable 方法。这包含了 UU.u 格式,分别将 UNIX 时间戳作为整数和将 UNIX 时间戳记作为包含微秒的浮点值。

$dt = DateTimeImmutable::createFromFormat('U', (string) 1703155440);
$dt->format('Y-m-d'); // "2023-12-21"

$dt = DateTimeImmutable::createFromFormat('U.u', (string) 1703155440.628);
$dt->format('Y-m-d h:i:s.u'); // "2023-12-21 10:44:00.628000"

这种方法要求检查时间戳值类型,并条件性地使用 UU.u 格式。此外,时间戳的值应为字符串类型,这意味着这需要将值强制转换为字符串。使用 U.u 格式,可以创建带有微秒精度的对象。

本例中,它使用了 (string) 强制转换语法,确保字符串强制转换的一致性并支持下划线数字分隔符。

@<timestamp> 构造函数格式t {#@timestamp-replacement}

DateTimeDateTimeImmutable 类的构造函数接收 date/time 值,它从一系列支持的格式中“猜想”格式。它支持的格式包括 @<timestamp><timestamp> 是 UNIX 时间戳的整数值。

该方法支持 float/decimal 值,这意味着该方式可以使用带有微秒精度的时间戳。

$dt = new DateTimeImmutable('@' . (string) 1703155440);
$dt->format('Y-m-d'); // "2023-12-21"

$dt = new DateTimeImmutable('@' . (string) 1703155440.628);
$dt->format('Y-m-d h:i:s.u'); // "2023-12-21 10:44:00.628000"

在已实例化的方法中调用 setTimestamp

DateTimeDateTimeImmutable 对象,setTimestamp 方法接收整型 UNIX 时间戳值。该方法还有一个小缺点,即使第一个实例化的给定/当前时间会被 setTimestamp 调用覆盖。 

该方法不支持微秒精度。

$dt = new DateTimeImmutable();
$dt->setTimestamp(1703155440);
$dt->format('Y-m-d'); // "2023-12-21"

向后兼容性影响

DateTimeDateTimeImmutable 类的 createFromTimeStamp 方法,是 PHP 8.4  的 DateTime 扩展中新增的。

使用现有的方法来创建具有确定的 UNIX 时间戳的实例,DateTime polyfill 和扩展 DateTime(Immutable) 类(如 Carbon)的 PHP 库可以模仿此功能,同时支持旧的 PHP 版本。