Không ai đề cập đến sử dụng DATE_ATOM đó là như xa như tôi biết PHPs thực hiện đúng nhất của ISO 8601. Cần ít nhất làm việc cho qua 3 trong số đó:
<?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";
}
?>
Để có thể phân tích tất cả chúng tôi viết một chức năng nhỏ:
<?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";
}
?>
Như @Glutexo đề cập đến nó chỉ hoạt động nếu chỉ có 1-6 chữ số chính xác cho phần thập phân, quá. Cảm thấy tự do để cải thiện nó.
giây phân đoạn của bạn không nằm trong định dạng. 'DateTime :: ISO8601' là một chuỗi có giá trị' Y-m-d \ TH: i: sO'. – salathe
WikiPedia không đồng ý: Phân số thập phân cũng có thể được thêm vào bất kỳ phần tử nào trong ba yếu tố thời gian. Dấu thập phân, dấu phẩy hoặc dấu chấm (không có bất kỳ tùy chọn nào được nêu gần đây nhất ở độ phân giải 10 của Hội nghị chung CGPM lần thứ 22 năm 2003), được sử dụng làm dấu phân tách giữa phần tử thời gian và phần của nó. Một phần chỉ có thể được thêm vào phần tử thời gian đặt hàng thấp nhất trong biểu diễn. – Jake
'public static DateTime DateTime :: createFromFormat (chuỗi $ format, string $ time [, DateTimeZone $ timezone])', có thể là do bao gồm múi giờ – ajreal