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
良い質問。ちょっと分からないなぁ…と思った。
regularmike

回答:


147

これは既知の問題です。

利用可能な日付は、実際にはvar_dump()ここのサポートの副作用です– derick@php.net

何らかの理由で、プロパティにアクセスすることはできないはずですがvar_dump、とにかくそれを表示します。本当にその形式で日付を取得したい場合は、DateTime::format()関数を使用してください。

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

1
なぜこのような正確なフォーマットが必要なのでしょうか?MySQLが日付に対して持っているものと同じフォーマットです。
エリアイリアシェンコ2015

@HelgaIliashenkoわかりません。私は、この正確なフォーマットが必要だとは言っていません。
jeremy、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意味ところは、私たちが使用することが利用可能になってきたでしょう。しかし、多くの内部クラスと同様に、それらはそうではなく、コードを修正するために「ハッキー」または「グリッチ」メソッドに依存すべきではありません。代わりに、APIを使用する必要があります

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

満足できない場合は、クラスを拡張するか、おそらくそれを拡張するCarbonを使用できます。

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

var_dump()オブジェクトの偽の出力をどのように作成するかを考えれば、__debugInfo()


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

彼は、なぜDateTimeオブジェクトのdateプロパティにアクセスできなかったのか知りたいと思っていました...格納されているDatetime値をどこにフォーマットしたいのでしょうか。「Ymd H:i:s」は、デフォルトの日付の魔女の形式です!
フィリペ

オブジェクトから配列への変換は、あなたが提案するように、おそらく最も簡単な方法です。
ジェフ

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 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.