4

私は、YouTube API リクエストからこの配列を取得していますが、私の意見では、デュレーション形式は非常にまれです。なぜ彼らはそこに秒を入れなかったのですか?いずれにせよ、これは配列です

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

この期間を PHP で "H:i:s" 形式に変換する方法はありますか?

よろしくお願いいたします。

4

11 に答える 11

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];
于 2013-10-24T10:00:25.550 に答える
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);
  }
于 2014-01-24T22:53:57.407 に答える
3

ここで@chris-zs の回答を使用し、それを 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;

}

それは私と一緒に働いた:)

于 2014-10-03T12:26:37.383 に答える
1

誰かが期間を取得するのに役立つかもしれません:

$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');
于 2016-12-06T12:45:48.957 に答える
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;
于 2013-11-20T17:31:46.493 に答える
0

次の php 関数を使用すると、YouTube ビデオの長さが返されます。よりエキサイティングなコードについては、このリンクをたどって コード サンプルを増やしてください。

    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');
于 2015-07-16T14:13:51.103 に答える