用PHP将Youtube数据API V3视频持续时间格式转换为标准时间

用PHP将Youtube数据API V3视频持续时间格式转换为标准时间,php,youtube-data-api,Php,Youtube Data Api,我从youtube API请求中获取了这个数组,但在我看来,持续时间格式非常罕见。他们为什么不在那里扔几秒钟?无论如何,这就是数组 [duration] => PT2M3S [dimension] => 2d [definition] => sd [caption] => false 有没有办法在PHP中将这个持续时间转换为“H:i:s”格式 提前感谢您的帮助事实上,这是一个简单的ISO8601日期。使用类似regexp的(\d+)将字符串拆分为分和秒。然后得到分钟除以

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

[duration] => PT2M3S
[dimension] => 2d
[definition] => sd
[caption] => false
有没有办法在PHP中将这个持续时间转换为“H:i:s”格式


提前感谢您的帮助

事实上,这是一个简单的ISO8601日期。使用类似regexp的
(\d+)
将字符串拆分为分和秒。然后得到分钟除以60的整数部分,得到小时数。用除法的剩余部分得到分钟数

这里有一个例子,虽然我没有测试它,但它应该可以工作

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

$hours = floor($parts[0][0]/60);
$minutes = $parts[0][0]%60;
$seconds = $parts[0][1];
这是我的解决方案:

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;
##:##:###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];
    }
    }
您可以使用php的类来正确解析它。例如,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);
  }

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

否则,该功能将按如下方式工作:

function duration($ytDuration) {

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

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

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

我本想在他的回答中添加这一点作为评论,但有一个完整的“你需要50个声誉来评论”的BS阻止我坚持这条线索的流程。

我使用了@chris-z-s的答案,并将其转换为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;

}
函数getDurationSeconds($duration){ preg_match_all('/[0-9]+[HMS]/',$duration,$matches); $duration=0; foreach($matches作为$match进行匹配){ //回音“
”=============
”; //打印(匹配); foreach($匹配为$部分){ $unite=substr($partment,strlen($partment)-1); 交换机($unite){ 案例'H':{ $duration+=substr($partment,0,strlen($partment)-1)*60*60; }中断; 案例'M':{ $duration+=substr($partment,0,strlen($partment)-1)*60; }中断; 案例'S':{ $duration+=substr($partment,0,strlen($partment)-1); }中断; } } //回声'
duratrion:'.$duration; //回音“
”=============
”; } 返回$duration; }
它与我一起工作:)

使用以下php函数将返回YouTube视频的持续时间。。有关更令人兴奋的代码,请遵循以下内容

函数getYouTube($vid) { $videoDetails=文件获取内容(“https://www.googleapis.com/youtube/v3/videos?id=“$vid.”&part=contentDetails&key=AIzaSyDen99uTRRPl9VT_Ra9eAisvZSc4aZDEns”); $videoDetails=json_decode($videoDetails,true); foreach($videoDetails['items']作为$vidTime) { $youtube_time=$vidTime['contentDetails']['duration']; preg_match_all(“/(\d+)/”,$youtube_time,$parts);
$hours=(strlen(floor($parts[0][0]/60))可能有助于获得持续时间:

$interval = new \DateInterval($iso8601);

// in seconds:
$seconds = $interval->h * 360 + $interval->i * 60 + $interval->s;

// in "H:i:s" format:
echo $interval->format('%H:%i:%s');
由于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);

具有命名组的解决方案

PT((?P<hours>\d+)H)?((?P<minutes>\d+)M)?((?P<seconds>\d+)S)?
PT((?P\d+H)?(?P\d+M)?(?P\d+S)?
这里可以找到一些例子

Python函数:

def yt_时间到秒(时间):
正则表达式字符串='PT((?P\d+)H?(?P\d+)M?(?P\d+)S?'
regex=re.compile(regex_字符串)
match=regex.match(时间)
如果匹配:
小时数=整数(匹配组('hours'))
分钟=int(match.group('minutes'))
秒=int(match.group('seconds'))
返回时间*60*60+分钟*60+秒
返回0

它100%适用于我,只有您应该拥有\DateInterval作为root用户

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

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

谢谢你的方法,最后我做到了。
code
duration=new DateInterval($videoData['duration']);$videoDuration=(60*60*$duration->h)+(60*$duration->I)+$duration->s;打印gmdate(“h:I:s”,$videoDuration);如果你有这样的模式,这将得到错误的数据:PT54S,youtube将给你这个持续时间,如果视频少于1分钟是的,这是正确的结果。但是,在我的情况下。我总是在所有的小时、分钟、秒中使用sprintf(“%02s”,“xx”)。(xx表示这些单位)。如果没有零前导,结果可能是1:2:6,持续1小时2分6秒。1:2:6看起来很奇怪。谢谢你的回答。
function NormalizeDuration($duration){ //pass your time
    $start = new \DateTime('@0');
    $start->add(new \DateInterval($duration));

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