【问题标题】:Why can't I access DateTime->date in PHP's DateTime class?为什么我不能在 PHP 的 DateTime 类中访问 DateTime->date?
【发布时间】:2012-12-14 14:05:40
【问题描述】:

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

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

我会返回这个错误信息

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

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

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。

【问题讨论】:

  • 好问题。我想了一会儿,我不明白......什么。

标签: php datetime


【解决方案1】:

这是known issue

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

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

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

【讨论】:

  • 为什么不想要这种精确的格式?它与 MySQL 的日期格式相同。
  • 如果使用 var_dump 或 print_r 也是一样的。
【解决方案2】:

更新: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 的记录行为,它可能随时更改。

【讨论】:

【解决方案3】:

正如其他答案所指出的,这是 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()

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 他想知道为什么他不能访问 DateTime 对象的日期属性...你在哪里看到他想格式化存储的 Datetime 值? "Y-m-d H:i:s" 是默认的日期格式!
    • 对象到数组的转换——正如你所建议的——可能是最简单的方法。
    【解决方案5】:

    如果您在询问属性日期之前只使用 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("Y-m-d H:i:s",strtotime($mydate->date));
    • 不,它不会,当然不是在 php7 中,会抛出 Notice: Undefined property: DateTime::$date
    猜你喜欢
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多