2012-11-09 17 views
8

Istnieje wiele pytań z pytaniem, jak to zrobić w inny sposób (konwersja z tego formatu), ale nie mogę znaleźć niczego na temat wyjścia w czasie trwania ISO 8601 format w PHP.PHP: Jak zmienić czas trwania ciągu na format czasu ISO 8601? (np. "30 minut" do "PT30M")

Mam więc stertę ciągów czasu w formacie czytelnym dla człowieka - chcę na bieżąco konwertować je do formatu ISO 8601, aby wydrukować czasy trwania dla mikrodanych HTML5. Poniżej znajduje się próbka niektórych napisów i sposób ich sformatowania. Należy je sformatować:

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

Masz pomysł.

mogę wcisnąć napis pod interwałowej obiektu w PHP:

date_interval_create_from_date_string("1 hour 30 minutes"); 

ale nie wydaje się być opcja wyjścia ISO 8601 - w jaki sposób należy podejść do tego?

Dzięki wszystkim.

Odpowiedz

13

Najpierw skonwertowałem to na numer, a potem z nim pracowałem.

pierwsze, należy strtotime():

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

Następnie można analizować je na czas, a wyjście w formacie PnYnMnDTnHnMnS. Chciałbym skorzystać z następujących metod (inspirowany 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; 
} 

Rezultat: http://codepad.org/1fHNlB6e

+0

doskonały. dzięki. =) – Chris

4

Oto uproszczona wersja time_to_iso8601_duration() funkcji Erica. Nie traci precyzji (365 dni w przybliżeniu na rok) i jest około 5 razy szybszy. Dane wyjściowe są mniej ładne, ale nadal zgodne z normą ISO 8601 zgodnie ze stroną 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); 
}