2012-11-09 8 views
8

Es gibt viele Fragen, wie man das anders macht (von dieses Format umwandeln), aber ich kann nichts finden, wie man in der ISO 8601 Dauer ausgibt Format in PHP.PHP: Wie konvertiert man Zeichenkettenlänge in ISO 8601 Dauerformat? (zB. "30 Minuten" bis "PT30M")

So habe ich eine Menge von Dauer Strings in menschlich lesbaren Format - ich möchte sie in das ISO 8601-Format konvertieren, um die Zeiten für HTML5-Mikrodaten zu drucken. Unten ist ein Beispiel für einige der Saiten auf sich warten, und wie sollten sie

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

Sie erhalten die Idee formatiert werden.

kann ich die Zeichenfolge in ein Intervall Objekt in PHP drücken:

date_interval_create_from_date_string("1 hour 30 minutes"); 

aber es scheint nicht zu einer ISO 8601 Ausgabe-Option zu sein - wie soll ich diesen Ansatz?

Danke allen.

Antwort

13

Ich würde es zuerst in eine Zahl umwandeln und dann damit arbeiten.

Verwenden Sie zuerst strtotime():

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

Dann können Sie es für die Dauer analysieren und die Ausgabe in PnYnMnDTnHnMnS Format. Ich würde die folgende Methode (inspiriert von http://csl.sublevel3.org/php-secs-to-human-text/) verwenden:

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; 
} 

Das Ergebnis: http://codepad.org/1fHNlB6e

+0

perfekt. Vielen Dank. =) – Chris

4

Hier ist eine vereinfachte Version von time_to_iso8601_duration() Funktion Eric. Es verliert nicht die Präzision (365 Tage Approximation eines Jahres) und ist etwa 5x schneller. Die Ausgabe ist weniger hübsch, aber immer noch ISO 8601 kompatibel nach this Seite.

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); 
}