2012-11-09 48 views
8

Có rất nhiều câu hỏi hỏi cách thực hiện theo cách khác (chuyển đổi từ định dạng này), nhưng tôi không thể tìm thấy bất kỳ thứ gì về cách xuất trong thời hạn ISO 8601 định dạng bằng PHP.PHP: Cách chuyển đổi thời lượng chuỗi thành định dạng thời lượng ISO 8601? (ví dụ: "30 phút" tới "PT30M")

Vì vậy, tôi có một chuỗi các chuỗi thời lượng ở định dạng có thể đọc được của con người - tôi muốn chuyển đổi chúng thành định dạng ISO 8601 khi đang bay để in thời lượng cho microdata HTML5. Dưới đây là mẫu của một số chuỗi đến và cách chúng được định dạng

"1 hour 30 minutes" --> PT1H30M 
"5 minutes" --> PT5M 
"2 hours" --> PT2H 

Bạn hiểu ý tưởng.

tôi có thể đẩy chuỗi thành một đối tượng khoảng thời gian trong PHP:

date_interval_create_from_date_string("1 hour 30 minutes"); 

nhưng có vẻ không phải là một đầu ra tùy chọn ISO 8601 - làm thế nào tôi nên tiếp cận này?

Cảm ơn tất cả.

Trả lời

13

Tôi muốn chuyển đổi nó thành một số đầu tiên, sau đó làm việc với số đó.

Thứ nhất, sử dụng strtotime():

$time = strtotime("1 hour 30 minutes", 0); 

Sau đó, bạn có thể phân tích nó cho thời gian, và đầu ra ở định dạng PnYnMnDTnHnMnS. Tôi muốn sử dụng các phương pháp sau đây (lấy cảm hứng từ http://csl.sublevel3.org/php-secs-to-human-text/):

function time_to_iso8601_duration($time) { 
    $units = array(
     "Y" => 365*24*3600, 
     "D" =>  24*3600, 
     "H" =>  3600, 
     "M" =>   60, 
     "S" =>   1, 
    ); 

    $str = "P"; 
    $istime = false; 

    foreach ($units as $unitName => &$unit) { 
     $quot = intval($time/$unit); 
     $time -= $quot * $unit; 
     $unit = $quot; 
     if ($unit > 0) { 
      if (!$istime && in_array($unitName, array("H", "M", "S"))) { // There may be a better way to do this 
       $str .= "T"; 
       $istime = true; 
      } 
      $str .= strval($unit) . $unitName; 
     } 
    } 

    return $str; 
} 

Kết quả: http://codepad.org/1fHNlB6e

+0

hoàn hảo. cảm ơn. =) – Chris

4

Đây là một phiên bản đơn giản của time_to_iso8601_duration() chức năng của Eric. Nó không mất độ chính xác (365 ngày xấp xỉ một năm) và nhanh hơn khoảng 5x. Đầu ra kém nhưng vẫn tương thích ISO 8601 theo trang this.

function iso8601_duration($seconds) 
{ 
    $days = floor($seconds/86400); 
    $seconds = $seconds % 86400; 

    $hours = floor($seconds/3600); 
    $seconds = $seconds % 3600; 

    $minutes = floor($seconds/60); 
    $seconds = $seconds % 60; 

    return sprintf('P%dDT%dH%dM%dS', $days, $hours, $minutes, $seconds); 
}