为什么我不能在PHP的DateTime类中访问DateTime-> date?


94

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。


1
好问题。我想了一下,我什么都不懂。
normalmike

Answers:


146

这是一个已知问题

有效的日期实际上是对var_dump()此处支持的副作用– derick@php.net

由于某些原因,您不应该能够访问该属性,但是var_dump无论如何都要显示它。如果您确实想以该格式获取日期,请使用该DateTime::format()函数。

echo $mydate->format('Y-m-d H:i:s');

1
为什么不想要这种确切的格式?它与MySQL的日期格式相同。
埃里亚·伊利亚申科

@HelgaIliashenko我不确定我是否理解。我从未说过不希望这种确切的格式。
杰里米,2015年

如果使用var_dump或print_r,则相同。
AndyGaskell,

15

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

<?php

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

这比使用速度要快一些,format()因为format()格式化已格式化的时间字符串。特别是如果您循环执行多次。

但是,这不是PHP的常规行为。上面的评论中提到的错误报告已被归档为@Nile。


2

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

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

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

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

如果您不满意,可以扩展课程,或者使用Carbon为您扩展课程。

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

如果您很伤心,如何var_dump()创建对象的假输出,请查看__debugInfo()


2

DateTime的date属性受到保护。

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

<?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) {
}

他想知道为什么他不能访问DateTime对象的date属性...在哪里看到他想格式化存储的Datetime值?“ Ymd H:i:s”是女巫的格式,默认为日期!
filipe

正如您所建议的那样,对象到数组的转换可能是最简单的方法。
杰夫兹

0

如果您只是在询问属性日期之前使用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,您将再次收到错误。


error_reporting(0); echo date(“ Ymd H:i:s”,strtotime($ mydate-> date));
Kaushik Das
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.