2012-11-09 9 views
8

これを行う方法を質問する質問がたくさんありますが(からこの形式に変換)、ISO 8601の期間で出力する方法は何も見つかりませんPHPのフォーマットPHP:文字列の長さをISO 8601の期間形式に変換するにはどうすればよいですか? (つまり、「30分」から「PT30M」に)

私は人間が読める形式でデュレーション文字列のヒープを持っています.HTML5マイクロデータの期間を印刷するために、それらをISO 8601形式に変換する必要があります。以下は、入力される文字列のサンプルとそのフォーマットの例です。

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

あなたはこのアイデアを得るでしょう。

私はPHPで間隔オブジェクトに文字列をプッシュすることができます。

date_interval_create_from_date_string("1 hour 30 minutes"); 

をしかし、ISO 8601の出力オプションがあるようには思えない - どのように私はこれにアプローチすべきか?

ありがとうございます。

答えて

13

私は最初に番号に変換してから作業します。

まず、strtotime()を使用します。

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

次にあなたが期間、およびPnYnMnDTnHnMnS形式での出力のためにそれを解析することができます。私は(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; 
} 

結果:http://codepad.org/1fHNlB6e

+0

が完璧です。ありがとう。 =) – Chris

4

ここでは、エリックのtime_to_iso8601_duration()機能の簡易版です。精度を失うことはなく(約365日の近似)、約5倍高速です。出力はそれほどきれいですが、まだthisページによるとISO 8601互換です。

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); 
} 
関連する問題