返回

PHP DateTimeImmutable 对象分钟无法修改,怎么办?

php

PHP 中 DateTimeImmutable 对象分钟无法修改问题及其解决方法

背景

DateTimeImmutable 是 PHP 中一个不可变的日期时间类,旨在存储和操作日期和时间值。然而,当使用 setTime() 函数修改 DateTimeImmutable 对象的分钟部分时,可能会遇到问题。这是因为 DateTimeImmutable 对象的不可变特性阻止对其进行直接修改。

解决方法

有几种方法可以解决此问题:

1. 使用 createFromMutable() 函数

$now = DateTimeImmutable::createFromMutable(new DateTime());
$now = $now->setTime(10, 0, 0);

2. 使用 with() 方法

$now = $now->withMinute(10);

3. 使用 modify() 方法

$now = $now->modify('+10 minutes');

详细说明

  • createFromMutable() 函数将一个可变的 DateTime 对象转换为一个不可变的 DateTimeImmutable 对象,从而允许对分钟进行修改。
  • with() 方法用于更新 DateTimeImmutable 对象的单个字段,例如分钟。
  • modify() 方法允许使用字符串格式指定的修改对 DateTimeImmutable 对象进行修改,例如将分钟加 10。

代码示例

$now = new DateTimeImmutable();
echo $now->format('Y-m-d H:m-s')."\n";
// -> 2020-03-25 08:03-22
$at10am = $now->setTime(10, 0, 0);
echo $at10am->format('Y-m-d H:m-s')."\n";
// -> 2020-03-25 10:03-00

结论

使用 DateTimeImmutable 对象时,了解其不可变特性至关重要。通过使用上面概述的解决方案,你可以轻松地修改分钟和其他字段,而无需担心对象不可变的限制。

常见问题解答

1. 为什么使用 DateTimeImmutable?

答: DateTimeImmutable 提供了不可变性,防止意外修改,从而提高了代码的可靠性和安全性。

2. 除了分钟外,我还可以修改哪些字段?

答: 你可以修改任何 DateTimeImmutable 字段,包括年、月、日、时、秒和微秒。

3. 我可以在 DateTimeImmutable 对象上使用 setTime() 函数吗?

答: 不,不能。setTime() 函数只适用于可变的 DateTime 对象。

4. 修改 DateTimeImmutable 对象后,它是否仍然不可变?

答: 是的,修改后的对象仍然是不可变的。它会返回一个新的 DateTimeImmutable 对象,其中包含更新后的值。

5. 是否可以在一个操作中同时修改多个字段?

答: 是的,你可以通过将 with() 方法链接在一起来同时修改多个字段。