¿Por qué no puedo acceder a DateTime-> date en la clase DateTime de PHP?

94

Usando la DateTimeclase, si intento ejecutar el siguiente código:

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

Volveré este mensaje de error

Aviso: Propiedad no definida: DateTime :: $ date ...

Lo cual no tiene sentido porque cuando se ejecuta var_dump()en la variable $mydate, muestra claramente que esta propiedad existe y es de acceso público:

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)

¿Es esto un error dentro de PHP o estoy haciendo algo mal? Estoy usando PHP 5.4.3.

okey_on
fuente
1
Buena pregunta. Por un momento pensé que no entendía ... nada.
regularmike

Respuestas:

147

Este es un problema conocido .

La fecha de disponibilidad es en realidad un efecto secundario del soporte para var_dump() aquí: [email protected]

Por alguna razón, se supone que no debe poder acceder a la propiedad, pero la var_dumpmuestra de todos modos. Si realmente desea obtener la fecha en ese formato, use la DateTime::format()función.

echo $mydate->format('Y-m-d H:i:s');
Jeremy
fuente
1
¿Por qué no querría uno este formato exacto? Es el mismo formato que tiene MySQL para las fechas.
Elia Iliashenko
@HelgaIliashenko No estoy seguro de entender. Nunca dije que uno no quisiera este formato exacto.
jeremy
Esto es lo mismo si usa var_dump o print_r.
AndyGaskell
15

Además de llamar DateTime::format(), puede acceder a la propiedad mediante la reflexión:

<?php

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

Esto es un poco más rápido que usarlo format()porque format()formatea una cadena de tiempo que ya ha sido formateada. Especialmente si lo haces muchas veces seguidas.

Sin embargo, este no es un comportamiento habitual de PHP. Ya se ha presentado un informe de error como @Nile mencionado en los comentarios anteriores.

hek2mgl
fuente
2

Como se señaló en las otras respuestas, es un problema con PHP que no está resuelto a partir de hoy, pero si es un 'efecto secundario' de, var_dump()no estoy tan seguro.

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

De lo que estoy seguro es de que si las propiedades de DateTimedonde estábamos destinados a ser utilizados por nosotros, se habrían puesto a disposición. Pero como muchas clases internas que son no y no se debe confiar en los métodos "hacky" o "glitchy" para fijar el código. En su lugar, debería utilizar su API .

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

Si no está satisfecho, puede extender la clase o tal vez usar Carbon que la extiende por usted.

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

Si no sabe cómo var_dump()crea una salida falsa de un objeto, eche un vistazo a__debugInfo()

Xorifelse
fuente
2

La propiedad de fecha de DateTime está protegida.

Puede mostrar la fecha con la función de formato.

<?php

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

O puede convertir a matriz:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}
filipe
fuente
Quería saber por qué no podía acceder a la propiedad de fecha del objeto DateTime ... ¿Dónde ve que quería formatear los valores de Datetime almacenados? "Ymd H: i: s" es el formato en el que la fecha es la predeterminada.
filipe
La conversión de objeto a matriz, como sugiere, es probablemente la forma más fácil de hacerlo.
Jeffz
0

Si solo usa un var_Dump antes de preguntar la fecha de la propiedad, todo funciona bien:

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

Esto ofrece:

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

Entonces ve que la fecha de propiedad existe incluso para el objeto. No puedo entender este comportamiento. Simplemente comente el var_Dump y obtendrá el error nuevamente.

Sascha
fuente
error_reporting (0); echo date ("Ymd H: i: s", strtotime ($ mydate-> date));
Kaushik Das