在php中转换youtube Api v3视频时长

Dan*_*har 18 php regex youtube-api

我如何将PT2H34M25S转换为2:34:25

我搜索并使用了这段代码.我是regex的新手可以有人解释一下吗?并帮助我解决我的问题

function covtime($youtube_time){
        preg_match_all('/(\d+)/',$youtube_time,$parts);
        $hours = floor($parts[0][0]/60);
        $minutes = $parts[0][0]%60;
        $seconds = $parts[0][1];
        if($hours != 0)
            return $hours.':'.$minutes.':'.$seconds;
        else
            return $minutes.':'.$seconds;
    }   
Run Code Online (Sandbox Code Playgroud)

但是这段代码只给我HH:MM

所以哑巴找到了解决方案:

   function covtime($youtube_time){
            preg_match_all('/(\d+)/',$youtube_time,$parts);
            $hours = $parts[0][0];
            $minutes = $parts[0][1];
            $seconds = $parts[0][2];
            if($seconds != 0)
                return $hours.':'.$minutes.':'.$seconds;
            else
                return $hours.':'.$minutes;
        }
Run Code Online (Sandbox Code Playgroud)

Ama*_*ali 27

使用DateTime类

您可以使用PHP的DateTime类来实现此目的.这个解决方案要简单得多,即使字符串中数量的格式顺序不同,也能正常工作.在这种情况下,正则表达式解决方案(很可能)会中断.

在PHP中,PT2H34M25S是一个有效的日期周期字符串,DateTime解析器可以理解它.然后我们利用这个事实,然后使用add()方法将其添加到Unix纪元.然后,您可以格式化结果日期以获得所需的结果:

function covtime($youtube_time){
    $start = new DateTime('@0'); // Unix epoch
    $start->add(new DateInterval($youtube_time));
    return $start->format('H:i:s');
}   

echo covtime('PT2H34M25S');
Run Code Online (Sandbox Code Playgroud)

演示

  • @JefferyThaGintoki:是的,这可以通过多种方式得到改善.我把它留给用户来弄清楚如何根据他们的要求修改函数:) (2认同)

Sha*_*ber 9

无论阿迈勒的和Pferate的解决方案是伟大的!然而,Amal解决方案继续给我1Hr额外.下面是我的解决方案,与Amal相同, 但差异方法和这项工作对我来说.

$date = new DateTime('1970-01-01');
$date->add(new DateInterval('PT2H34M25S'));
echo $date->format('H:i:s')
Run Code Online (Sandbox Code Playgroud)

datetime->add() 参考


dw1*_*dw1 5

这是我的解决方案,处理丢失的H,M或S(测试报告长度为1:00:01视频,你会看到其他答案的问题).单独的秒数显示为0:01,但是如果你想改变它只是将最后一个改为,elseif($M>0)并为秒添加一个例外,例如else { return ":$S" }

// convert youtube v3 api duration e.g. PT1M3S to HH:MM:SS
// updated to handle videos days long e.g. P1DT1M3S
function covtime($yt){
    $yt=str_replace(['P','T'],'',$yt);
    foreach(['D','H','M','S'] as $a){
        $pos=strpos($yt,$a);
        if($pos!==false) ${$a}=substr($yt,0,$pos); else { ${$a}=0; continue; }
        $yt=substr($yt,$pos+1);
    }
    if($D>0){
        $M=str_pad($M,2,'0',STR_PAD_LEFT);
        $S=str_pad($S,2,'0',STR_PAD_LEFT);
        return ($H+(24*$D)).":$M:$S"; // add days to hours
    } elseif($H>0){
        $M=str_pad($M,2,'0',STR_PAD_LEFT);
        $S=str_pad($S,2,'0',STR_PAD_LEFT);
        return "$H:$M:$S";
    } else {
        $S=str_pad($S,2,'0',STR_PAD_LEFT);
        return "$M:$S";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • “YouTube API 持续时间时间戳”难题的最佳解决方案。经过测试并适用于所有情况。 (2认同)