101

使用DateTime该类,如果我尝试运行以下代码:

$mydate = new DateTime();
echo $mydate->date;

我会回复这个错误信息

注意:未定义的属性:DateTime::$date...

这没有任何意义,因为在var_dump()变量上运行时$mydate,它清楚地表明该属性存在并且可以公开访问:

var_dump($mydate);

object(DateTime)[1]
  public 'date' => string '2012-12-29 17:19:25' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)

这是PHP中的错误还是我做错了什么?我正在使用 PHP 5.4.3。

4

5 回答 5

158

这是一个已知问题

可用日期实际上是var_dump()这里支持的副作用 – derick@php.net

出于某种原因,您不应该能够访问该属性,但var_dump无论如何都会显示它。如果您真的想以该格式获取日期,请使用该DateTime::format()功能。

echo $mydate->format('Y-m-d H:i:s');
于 2012-12-29T17:42:37.637 回答
15

更新:PHP7.3 中的行为发生了变化,原来的答案不再起作用。要在所有 PHP 版本中获得相同的结果,包括。>=7.3,可以使用以下代码:

$dt = new DateTime();
$date = $dt->format('Y-m-d\TH:i:s.v');

作为记录,原始答案:

除了调用之外,DateTime::format()您还可以使用反射访问该属性:

<?php

$dt = new DateTime();
$o = new ReflectionObject($dt);
$p = $o->getProperty('date');
$date = $p->getValue($dt);

这比使用稍微快一些,format()因为format()格式化已经格式化的时间字符串。特别是如果您在循环中多次执行此操作。

然而,这不是 PHP 的记录行为,它可能随时更改。

于 2012-12-29T17:44:55.600 回答
2

DateTime 的日期属性受到保护。

您可以使用格式功能显示日期。

<?php

try {
    $time = new DateTime();
    echo($time->format("Y-m-d H:i:s"));
} catch (Exception $e) {
}

或者您可以转换为数组:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}
于 2019-04-10T05:58:46.307 回答
2

正如其他答案所指出的,这是 PHP 的一个问题,截至目前尚未解决,但如果它是var_dump()我不太确定的“副作用”。

echo ((array) new DateTime())['date']; // Works in PHP 7.

我可以肯定的是,如果我们打算使用 where的属性,DateTime它将已经可用。但就像许多内部类一样,它们不是,你不应该依赖“hacky”或“glitchy”方法来修复你的代码。相反,您应该使用他们的API

echo (new DateTime())->format('Y-m-d H:i:s');

如果您不满意,您可以扩展该类,或者使用为您扩展它的Carbon

echo (new Carbon())->toDateTimeString();

如果您了解如何var_dump()创建对象的虚假输出,请查看__debugInfo()

于 2016-12-22T03:26:45.197 回答
-1

如果您在询问属性日期之前只使用var_Dump一切正常:

$mydate = new DateTime();
var_Dump($mydate);
echo '<br>';
echo $mydate->date;

这提供:

object(DateTime)#1 (3) { ["date"]=> string(26) "2017-04-11 08:44:54.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" }
2017-04-11 08:44:54.000000

因此,您会看到即使该对象也存在属性日期。我无法理解这种行为。只需将 var_Dump 注释掉,您将再次收到错误消息。

于 2017-04-11T13:06:37.907 回答