Nadie mencionó a utilizar DATE_ATOM que es como lo que sé phps más correcta aplicación de la norma ISO 8601. Debe al menos trabajo para el último 3 de estos:
<?php
$dates = array(
"2010-12-07T23:00:00.000Z",
"2010-12-07T23:00:00",
"2010-12-07T23:00:00Z",
"2010-12-07T23:00:00+01:00",
(new \DateTime("now"))->format(DATE_ATOM)
);
foreach($dates as $d) {
$res = \DateTime::createFromFormat(DATE_ATOM, $d);
echo "try $d: \n";
var_dump($res);
echo "\n\n";
}
?>
Para ser capaz de analizar todos ellos i escribió una función pequeña:
<?php
function parse_iso_8601($iso_8601_string) {
$results = array();
$results[] = \DateTime::createFromFormat("Y-m-d\TH:i:s",$iso_8601_string);
$results[] = \DateTime::createFromFormat("Y-m-d\TH:i:s.u",$iso_8601_string);
$results[] = \DateTime::createFromFormat("Y-m-d\TH:i:s.uP",$iso_8601_string);
$results[] = \DateTime::createFromFormat("Y-m-d\TH:i:sP",$iso_8601_string);
$results[] = \DateTime::createFromFormat(DATE_ATOM,$iso_8601_string);
$success = array_values(array_filter($results));
if(count($success) > 0) {
return $success[0];
}
return false;
}
// Test
$dates = array(
"2010-12-07T23:00:00.000Z",
"2010-12-07T23:00:00",
"2010-12-07T23:00:00Z",
"2010-12-07T23:00:00+01:00",
(new \DateTime("now"))->format(DATE_ATOM)
);
foreach($dates as $d) {
$res = parse_iso_8601($d);
echo "try $d: \n";
var_dump($res);
echo "\n\n";
}
?>
Como se mencionó @Glutexo funciona sólo si hay sólo 1 a 6 dígitos de precisión para la parte decimal, también. Siéntase libre de mejorarlo.
Sus fracciones de segundo no son parte del formato. 'DateTime :: ISO8601' es una cadena con el valor' Y-m-d \ TH: i: sO'. – salathe
WikiPedia no está de acuerdo: Las fracciones decimales también se pueden agregar a cualquiera de los tres elementos de tiempo. Un punto decimal, ya sea una coma o un punto (sin ninguna preferencia, como se indicó más recientemente en la resolución 10 de la 22ª Conferencia General CGPM en 2003), se usa como un separador entre el elemento de tiempo y su fracción. Una fracción solo se puede agregar al elemento de tiempo de orden más bajo en la representación. – Jake
'public static DateTime DateTime :: createFromFormat (string $ format, string $ time [, DateTimeZone $ timezone])', puede deberse a la inclusión de la zona horaria – ajreal