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内のバグですか、それとも何か間違ったことをしていますか?PHP5.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

他の回答で指摘されているように、これはPHPの問題であり、今日の時点では解決されていませんが、それが「副作用」であるvar_dump()かどうかはわかりません。

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

私が確信しているは、私たちが使用することを意図した場所のプロパティがDateTime利用可能になっていただろうということです。しかし、多くの内部クラスと同様に、それらはそうではなく、コードを修正するために「ハッキー」または「グリッチ」メソッドに依存するべきではありません。代わりに、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 に答える
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) {
}
于 2019-04-10T05:58:46.307 に答える
-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 に答える