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
2 respuestas
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í.
Sí, aparentemente solo se solucionó en PHP 7.3.0, consulte este https://3v4l.org/4nMi4
Preguntas relacionadas
Nuevas preguntas
php
PHP es un lenguaje de secuencias de comandos interpretado, dinámico, orientado a objetos y ampliamente utilizado, diseñado principalmente para el desarrollo web del lado del servidor. Se utiliza para preguntas sobre el lenguaje PHP.