Por que não consigo acessar DateTime-> date na classe DateTime do PHP?

94

Usando a DateTimeclasse, se eu tentar executar o seguinte código:

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

Vou receber de volta esta mensagem de erro

Aviso: Propriedade indefinida: DateTime :: $ date ...

O que não faz sentido porque, ao ser executado var_dump()na variável $mydate, mostra claramente que essa propriedade existe e está acessível publicamente:

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)

Isso é um bug no PHP ou estou fazendo algo errado? Estou usando o PHP 5.4.3.

okey_on
fonte
1
Boa pergunta. Eu pensei por um momento que não entendia ... nada.
regularmike de

Respostas:

147

Este é um problema conhecido .

A data de disponibilização é, na verdade, um efeito colateral do suporte para var_dump()aqui - [email protected]

Por alguma razão, você não deveria ser capaz de acessar a propriedade, mas a var_dumpmostra de qualquer maneira. Se você realmente deseja obter a data nesse formato, use a DateTime::format()função.

echo $mydate->format('Y-m-d H:i:s');
jeremy
fonte
1
Por que não se deseja este formato exato? É o mesmo formato que o MySQL tem para datas.
Elia Iliashenko
@HelgaIliashenko Não tenho certeza se entendi. Eu nunca disse que ninguém iria querer esse formato exato.
jeremy
É o mesmo se usar var_dump ou print_r.
AndyGaskell
15

Além de chamar, DateTime::format()você pode acessar a propriedade usando o reflexo:

<?php

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

Isso é um pouco mais rápido do que usar format()porque format()formata uma sequência de tempo que já foi formatada. Especialmente se você fizer isso muitas vezes em um loop.

No entanto, este não é um comportamento normal do PHP. Um relatório de bug já foi preenchido como @Nile mencionado nos comentários acima.

hek2mgl
fonte
2

Conforme observado pelas outras respostas, é um problema com o PHP que não está resolvido até hoje, mas se for um 'efeito colateral' de, var_dump()não tenho certeza ..

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

O que tenho certeza é que, se as propriedades de DateTimeonde deveriam ser usadas por nós, teriam sido disponibilizadas. Mas, como muitas classes internas, eles não são e você não deve confiar em métodos "hacky" ou "glitchy" para consertar seu código. Em vez disso, você deve usar sua API .

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

Se você não estiver satisfeito, pode estender o curso ou talvez usar Carbon que o estende para você.

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

Se você se perguntar como var_dump()cria uma saída falsa de um objeto, dê uma olhada em__debugInfo()

Xorifelse
fonte
2

A propriedade de data de DateTime é protegida.

Você pode exibir a data com a função de formato.

<?php

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

Ou você pode converter em array:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}
filipe
fonte
Ele queria saber por que não conseguia acessar a propriedade de data do objeto DateTime ... Onde você vê que ele queria formatar os valores Datetime armazenados? "Ymd H: i: s" é o formato em que a data é por padrão!
filipe
A conversão de objeto em array - como você sugere - é provavelmente a maneira mais fácil de fazer.
Jeffz
0

Se você apenas usar um var_Dump antes de perguntar a data da propriedade, tudo funcionará bem:

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

Isso oferece:

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

Portanto, você vê que a data da propriedade existe até para o objeto. Eu não consigo entender esse comportamento. Apenas comente o var_Dump e você obterá o erro novamente.

Sascha
fonte
relatório_de_erro (0); echo date ("Ymd H: i: s", strtotime ($ mydate-> date));
Kaushik Das