将Youtube Data API V3视频时长格式转换为PHP中的标准时间

时间:2013-10-24 09:34:06

标签: php youtube-data-api

我是从youtube API请求中获取此数组,但在我看来,持续时间格式非常少见。他们为什么不在那里扔几秒钟?无论如何,这是数组

[duration] => PT2M3S
[dimension] => 2d
[definition] => sd
[caption] => false

有没有办法在PHP中将此持续时间转换为“H:i:s”格式?

提前感谢您的帮助

11 个答案:

答案 0 :(得分:6)

acidjazz有一个很好的解决方案,但有一个错字显示分钟。它应该是$di->i分钟,而不是$di->m。如果您没有在对象中使用它,也可以删除“公共静态”部分,然后我取出了sprintf()

否则该函数按原样工作:

function duration($ytDuration) {

    $di = new DateInterval($ytDuration);
    $string = '';

    if ($di->h > 0) {
      $string .= $di->h.':';
    }

    return $string.$di->i.':'.$di->s;
}

我会将此作为评论添加到他的答案中,但是整个“你需要50个评论的声誉”BS会阻止我坚持这个帖子的流程。

答案 1 :(得分:5)

实际上它是简单的ISO8601日期。将正则表达式(例如(\d+))拆分为分钟和秒。然后得到60分钟的整数部分得到小时。获得该部门的其余部分以获得分钟。

这是一个应该工作的例子,虽然我没有测试它

preg_match_all('/(\d+)/',$youtube_time,$parts);

$hours = floor($parts[0][0]/60);
$minutes = $parts[0][0]%60;
$seconds = $parts[0][1];

答案 2 :(得分:4)

您可以使用php的DateInterval类正确解析它。例如,youtube包装器类中的一个函数将其解析为YouTube显示的格式:

  public static function duration($ytDuration) {

    $di = new DateInterval($ytDuration);
    $string = '';

    if ($di->h > 0) {
      $string .= $di->h.':';
    }

    return $string.$di->m.':'.sprintf('%02s',$di->s);
  }

答案 3 :(得分:2)

我使用了@ chris-z-s的答案here,并将其转换为php:

function getDurationSeconds($duration){
    preg_match_all('/[0-9]+[HMS]/',$duration,$matches);
    $duration=0;
    foreach($matches as $match){
        //echo '<br> ========= <br>';       
        //print_r($match);      
        foreach($match as $portion){        
            $unite=substr($portion,strlen($portion)-1);
            switch($unite){
                case 'H':{  
                    $duration +=    substr($portion,0,strlen($portion)-1)*60*60;            
                }break;             
                case 'M':{                  
                    $duration +=substr($portion,0,strlen($portion)-1)*60;           
                }break;             
                case 'S':{                  
                    $duration +=    substr($portion,0,strlen($portion)-1);          
                }break;
            }
        }
    //  echo '<br> duratrion : '.$duration;
    //echo '<br> ========= <br>';
    }
     return $duration;

}

它和我一起工作:)

答案 4 :(得分:0)

这是我的解决方案:

preg_match('/(\d+)H/', $duration, $match);
$h = ($match[0])?filter_var($match[0], FILTER_SANITIZE_NUMBER_INT).":":'';
preg_match('/(\d+)M/', $duration, $match);
$m = filter_var($match[0], FILTER_SANITIZE_NUMBER_INT).":";
preg_match('/(\d+)S/', $youtube_date, $match);
$s = filter_var($match[0], FILTER_SANITIZE_NUMBER_INT);
echo: "Duration: " . $h.$m.$s;

答案 5 :(得分:0)

##:##:## PHP上的时间格式

 function NormalizeDuration($duration){
    preg_match('#PT(.*?)H(.*?)M(.*?)S#si',$duration,$out);
    if(empty($out[1])){
    preg_match('#PT(.*?)M(.*?)S#si',$duration,$out);
    if(empty($out[1])){
    preg_match('#PT(.*?)S#si',$duration,$out);
    if(empty($out[1])){
    return '00:00';
    }
    }else{
    if(strlen($out[1])==1){ $out[1]= '0'.$out[1]; }
    if(strlen($out[2])==1){ $out[2]= '0'.$out[2]; }
    return $out[1].':'.$out[2];
    }
    }else{
    if(strlen($out[1])==1){ $out[1]= '0'.$out[1]; }
    if(strlen($out[2])==1){ $out[2]= '0'.$out[2]; }
    if(strlen($out[3])==1){ $out[3]= '0'.$out[3]; }
    return $out[1].':'.$out[2].':'.$out[3];
    }
    }

答案 6 :(得分:0)

使用以下php功能将返回YouTube视频时长。如需更多令人兴奋的代码,请按以下link more code samples

Branch Specifier

答案 7 :(得分:0)

对某人来说可能会有所帮助:

ContractType.Permanent.GetEnumDisplayName();

答案 8 :(得分:0)

由于YouTube(谷歌)很难,他们选择非标准格式。 所以标准功能总是不起作用。

因此,我根据自己的需要做了这个。

$length = $data['items'] ..... ['duration'];

$seconds = substr(stristr($length, 'S', true), -2, 2);
$seconds = preg_replace("/[^0-9]/", '', $seconds);
$minutes =  substr(stristr($length, 'M', true), -2, 2);
$minutes = preg_replace("/[^0-9]/", '', $minutes);
$hours =  substr(stristr($length, 'H', true), -2, 2);
$hours = preg_replace("/[^0-9]/", '', $hours);

答案 9 :(得分:0)

命名组的解决方案

PT((?P<hours>\d+)H)?((?P<minutes>\d+)M)?((?P<seconds>\d+)S)?

可在此处找到示例https://regex101.com/r/wU3hT2/114

Python函数:

def yt_time_to_seconds(time):
    regex_string = 'PT((?P<hours>\d+)H)?((?P<minutes>\d+)M)?((?P<seconds>\d+)S)?'
    regex = re.compile(regex_string)
    match = regex.match(time)
    if match:
        hours = int(match.group('hours'))
        minutes = int(match.group('minutes'))
        seconds = int(match.group('seconds'))
        return hours * 60 * 60 + minutes * 60 + seconds
    return 0

答案 10 :(得分:0)

它对我100%完美,只有您应该以\ DateInterval作为根

function NormalizeDuration($duration){ //pass your time
    $start = new \DateTime('@0');
    $start->add(new \DateInterval($duration));

    return $start->format('H:i:s'); //format
}