Никто не упомянул использовать DATE_ATOM, который, насколько я знаю ПГПС наиболее правильное внедрение ISO 8601. Он должен, по крайней мере, работа за последние 3 из них:
<?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";
}
?>
Чтобы иметь возможность проанализировать все из них я написал маленькую функцию:
<?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";
}
?>
Как @Glutexo упомянуто, что он работает только тогда, когда есть только 1 до 6 точности цифр для десятичной части тоже. Не стесняйтесь улучшать его.
Ваши доли секунды не являются частью формата. 'DateTime :: ISO8601' - это строка со значением' Y-m-d \ TH: i: sO'. – salathe
WikiPedia не согласен: Десятичные фракции также могут быть добавлены к любому из трех элементов времени. Десятичная точка, либо запятая, либо точка (без каких-либо предпочтений, как было заявлено совсем недавно в резолюции 10 22-й Генеральной конференции CGPM в 2003 году), используется как разделитель между элементом времени и его дробью. Фракция может быть добавлена только к элементу времени наименьшего порядка в представлении. – Jake
'public static DateTime DateTime :: createFromFormat (строка $ format, string $ time [, DateTimeZone $ timezone])', возможно, вызвана включением часового пояса – ajreal