1

我正在开发一个 Laravel 项目。我尝试使用 Carbon 创建一个 DateTime 对象。这是我尝试过的:

Carbon::createFromFormat('Y-m-d H:i:s', '2021-10-01T00:01:00')->toDateTime();

但我的 phpstan 抱怨:Cannot call method toDateTime() on Carbon\Carbon|false.

为什么会出现这个错误?转换CarbonDateTime对象的正确方法是什么?

4

3 回答 3

4

您的格式不正确,因此 Carbon 无法创建时间。您错过了需要转义的 T。

Carbon::createFromFormat('Y-m-d\TH:i:s', '2021-10-01T00:01:00')->toDateTime();
于 2021-11-11T13:56:20.383 回答
1

如果 PHPStan 抱怨,那是因为静态分析(不执行代码)无法正确确定类型。随着 Carbon 的扩展DateTimePHP 文档可以帮助此方法调用:

返回一个新的 DateTime 实例或失败时返回 false。

因此,为了确保代码在静态分析方面是正确的,您需要将其拆分:

$object = Carbon::createFromFormat('Y-m-d H:i:s', '2021-10-01T00:01:00');

if (!$object instanceof Carbon) {
  throw new RuntimeException('could not parse date');
}

$object->toDateTime();

不同之处:现在,PHPStan 可以安全地假定在被调用时是$object类型CarbontoDateTime()


正如其他人指出的那样:运行该代码也会产生错误,因为您尝试解析的日期格式与输入日期不匹配。但这超出了 PHPStan 的范围,它不执行代码

于 2021-11-11T14:06:33.327 回答
0

Carbon 对象已经是DateTime 对象。

class Carbon extends \DateTime

你可能想要toDateTimeString,但如果你真的想要一个 DateTime 对象,你已经有了一个,只是在上面撒了一点 Carbon 语法糖。

如果您真的需要一个 DateTime 对象,那么该->toDate()函数就是您要寻找的。

https://carbon.nesbot.com/docs/

返回与当前实例匹配的原生 DateTime PHP 对象。

于 2021-11-11T14:00:43.830 回答