2012-11-09 64 views
8

有很多问如何做这另一种方式(从这个格式转换)的问题,但我不能找到任何东西如何在ISO 8601持续时间的输出格式在PHP中。PHP:如何串持续时间转换为ISO 8601持续时间格式? (即“30分钟”到“PT30M”)

所以我有时间字符串人类可读的格式的堆 - 我想将它们转换成上飞ISO 8601格式打印的HTML5微的持续时间。下面是一些字符串进来的示例,以及它们应该如何格式化。

"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

这是Eric的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); 
} 
相关问题