Personne mentionné à utiliser DATE_ATOM qui est autant que je sache phps la mise en œuvre la plus correcte de la norme ISO 8601. Il devrait au moins travailler pour la dernière de ces trois:
<?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";
}
?>
Pour pouvoir analyser tous les i a écrit une petite fonction:
<?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";
}
?>
Comme mentionné @Glutexo il ne fonctionne que s'il n'y a que 1 à 6 chiffres de précision pour la partie décimale, aussi. N'hésitez pas à l'améliorer.
Vos fractions de secondes ne font pas partie du format. 'DateTime :: ISO8601' est une chaîne avec la valeur' Y-m-d \ TH: i: sO'. – salathe
WikiPedia n'est pas d'accord: Des fractions décimales peuvent également être ajoutées à l'un des trois éléments de temps. Un point décimal, soit une virgule, soit un point (sans aucune préférence comme indiqué plus récemment dans la résolution 10 de la 22e Conférence générale de la CGPM en 2003), est utilisé comme séparateur entre l'élément temps et sa fraction. Une fraction peut seulement être ajoutée à l'élément de temps le plus bas de la représentation. – Jake
'public static DateTime DateTime :: createFromFormat (chaîne $ format, chaîne $ time [, DateTimeZone $ timezone])', peut-être est provoquée par inclusive du fuseau horaire – ajreal