2013-10-24 63 views
2

我是從一個YouTube API請求獲取這個數組,但持續時間格式在我看來非常少見。他們爲什麼不在那裏投幾秒鐘?在任何情況下,這是陣列將Youtube Data API V3視頻持續時間格式轉換爲PHP中的標準時間

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

有沒有辦法將此持續時間轉換爲PHP中的「H:i:s」格式?

在此先感謝您的幫助

回答

4

實際上它是簡單的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]; 
+3

感謝您的方法,最後我做到了。 'code' $ duration = new DateInterval($ videoData ['duration']); $ videoDuration =(60 * 60 * $ duration-> h)+(6​​0 * $ duration-> i)+ $ duration-> s; print gmdate(「H:i:s」,$ videoDuration); – user2915047

+0

哦。然後你可以打電話給$ duration-> format('H:i:s') – Andrew

+0

這樣會得到錯誤的數據,如果你有這樣的模式:PT54S,如果視頻少於1分鐘,youtube會給你這個持續時間 – Yahia

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; 
-1

##:##:##對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]; 
    } 
    } 
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); 
    } 
5

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阻止我粘到這個線程的流程。

+0

好的解決辦法,謝謝你是 –

+0

是的,這是正確的結果。 但是,在我的情況。我總是在所有小時,分鐘,秒鐘內使用sprintf('%02s','xx')。 (xx表示這些單位)。 如果沒有導致結果的零可能是1:2:6 1小時2分6秒。 1:2:6看起來很奇怪。 謝謝你的回答。 – vee

2

我用@克里斯-ZS的回答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; 

} 

它與我的工作:)

0

使用下面的PHP函數將返回YouTube視頻的時長。 。對於更精彩的代碼遵循這一linkmore code samples

function getYoutubeDuration($vid) 
    { 
    $videoDetails =file_get_contents("https://www.googleapis.com/youtube/v3/videos?id=".$vid."&part=contentDetails&key=AIzaSyDen99uTRRPl9VT_Ra9eAisvZSc4aZDEns"); 
    $videoDetails =json_decode($videoDetails, true); 
    foreach ($videoDetails['items'] as $vidTime) 
    { 
     $youtube_time = $vidTime['contentDetails']['duration']; 
     preg_match_all('/(\d+)/',$youtube_time,$parts); 
     $hours = (strlen(floor($parts[0][0]/60))<1)?floor($parts[0][0]/60):'0'.floor($parts[0][0]/60); 
     $minutes = $parts[0][0]%60; (strlen($parts[0][0]%60)<1)?$parts[0][0]%60:'0'.$parts[0][0]%60; 
     $seconds = $parts[0][1];(strlen($parts[0][1])<1)?$parts[0][1]:'0'.$parts[0][1]; 
     return $hours.":".$minutes.":".$seconds; 
    } 
    } 

    echo getYoutubeDuration('J1lb3qJgfho'); 
0

可能會有幫助的人得到持續時間:

$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'); 
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); 
相關問題