我是从youtube API请求中获取此数组,但在我看来,持续时间格式非常少见。他们为什么不在那里扔几秒钟?无论如何,这是数组
[duration] => PT2M3S
[dimension] => 2d
[definition] => sd
[caption] => false
有没有办法在PHP中将此持续时间转换为“H:i:s”格式?
提前感谢您的帮助
答案 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
}