Parece que no puedo hacer que DateTime::createFromFormat() funcione en PHP 7.0.26

Mi código

date_default_timezone_set('America/New_York');

$t = '2018-02-23T11:29:16.434Z';
echo '$t: ' . json_encode($t) . PHP_EOL;
$f = DateTime::RFC3339_EXTENDED;
echo '$f: ' . json_encode($f) . PHP_EOL;
echo 'createFromFormat: ' . json_encode(DateTime::createFromFormat($f, $t)) . PHP_EOL;
echo 'getLastErrors: ' . json_encode(DateTime::getLastErrors()) . PHP_EOL;

$t = '2018-02-23T11:29:16.434+00:00';
echo '$t: ' . json_encode($t) . PHP_EOL;
echo 'createFromFormat: ' . json_encode(DateTime::createFromFormat($f, $t)) . PHP_EOL;
echo 'getLastErrors: ' . json_encode(DateTime::getLastErrors()) . PHP_EOL;

Salida:

$t: "2018-02-23T11:29:16.434Z"
$f: "Y-m-d\\TH:i:s.vP"
createFromFormat: false
getLastErrors: {"warning_count":0,"warnings":[],"error_count":2,"errors":{"20":"The format separator does not match","21":"The timezone could not be found in the database"}}
$t: "2018-02-23T11:29:16.434+00:00"
createFromFormat: false
getLastErrors: {"warning_count":0,"warnings":[],"error_count":2,"errors":{"20":"The format separator does not match","21":"The timezone could not be found in the database"}}

Observo que "v" no aparece en los valores del parámetro de formato para DateTime :: createFromFormat () - pero supuestamente debería poder usar la const DateTime::RFC3339_EXTENDED que incluye una "v". También dice que esta constante se agregó en la versión 7.0

7
user9645 23 feb. 2018 a las 16:09

2 respuestas

La mejor respuesta

Como señaló CBroe, esta es la solución adecuada para usted. Debes usar Y-m-d\TH:i:s.uP en lugar de DateTime::RFC3339_EXTENDED, que es Y-m-d\TH:i:s.vP:

$date = DateTime::createFromFormat("Y-m-d\TH:i:s.uP", "2018-02-23T11:29:16.434Z"); //works

De hecho, fui a ver por qué sucede esto, y esto es lo que encontré.

Hay un error cerrado que solicita soporte para RFC3339 con milisegundos. El autor del error creó una solicitud de extracción para agregar esta función. Pero aunque creó una constante RFC3339_EXTENDED para la función format, no agregó el soporte para createFromFormat. Si echa un vistazo aquí , no hay soporte para la opción v (que es milisegundos). Así que sí.

15
Alex Karshin 23 feb. 2018 a las 14:19

Sí, aparentemente solo se solucionó en PHP 7.3.0, consulte este https://3v4l.org/4nMi4

enter image description here

3
max4ever 21 oct. 2019 a las 12:29