如何将YouTube API持续时间(ISO 8601持续时间格式为PT#M#S)转换为秒

时间:2013-09-27 23:01:11

标签: javascript youtube-javascript-api

如何使用JavaScript操作PT#M#S格式的日期时间?

例如:PT5M33S

我想输出为hh:mm:ss

4 个答案:

答案 0 :(得分:21)

这是获取总秒数和其他部分的基本代码。 这样做我感到很不安,因为规则说任何时候你想要约会逻辑你都不应该:)但是无论如何,谷歌让它变得不容易,在getduration播放器API中提供总秒数,并提供gdata api完全不同的格式。

          var reptms = /^PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?$/;
          var hours = 0, minutes = 0, seconds = 0, totalseconds;

          if (reptms.test(input)) {
            var matches = reptms.exec(input);
            if (matches[1]) hours = Number(matches[1]);
            if (matches[2]) minutes = Number(matches[2]);
            if (matches[3]) seconds = Number(matches[3]);
            totalseconds = hours * 3600  + minutes * 60 + seconds;
          }

答案 1 :(得分:4)

以下是通过 Youtube API(v3)以简单方式获取YouTube视频数据的方法,并将视频时长(ISO 8601)转换为秒。不要忘记将网址中的 {YOUR VIDEO ID} {YOUR KEY} 属性更改为您的视频ID 和< strong>公共谷歌密钥。您可以创建访问Google开发者控制台的公钥。

  $.ajax({
       url: "https://www.googleapis.com/youtube/v3/videos?id={ YOUR VIDEO ID }&part=contentDetails&key={ YOUR KEY }",
       dataType: "jsonp",
       success: function (data) { youtubeCallback (data); }
  });

    function youtubeCallback(data) {

        var duration = data.items[0].contentDetails.duration;
        alert ( convertISO8601ToSeconds (duration) );
    }        

    function convertISO8601ToSeconds(input) {

        var reptms = /^PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?$/;
        var hours = 0, minutes = 0, seconds = 0, totalseconds;

        if (reptms.test(input)) {
            var matches = reptms.exec(input);
            if (matches[1]) hours = Number(matches[1]);
            if (matches[2]) minutes = Number(matches[2]);
            if (matches[3]) seconds = Number(matches[3]);
            totalseconds = hours * 3600  + minutes * 60 + seconds;
        }

        return (totalseconds);
    }

答案 2 :(得分:1)

虽然这些答案在技术上是正确的;如果您计划在时间和持续时间上做很多事,那么您应该查看momentjs。还可以查看moment-duration-formats,这使格式化持续时间与常规时刻一样简单

这两个模块如何轻松实现这个

的一个例子
moment.duration('PT5M33S').format('hh:mm:ss')

将输出05:33。还有很多其他用途。

虽然youtube使用ISO8601格式是有原因的,因为它是标准,所以请记住这一点。

答案 3 :(得分:0)

我通过检查字符左边两个索引(H,M,S)并检查它是否是一个数字来解决这个问题,如果不是,则该单位是一位数字,因此我在前面加了一个'0'。否则,我将返回两位数的数字。

   function formatTimeUnit(input, unit){
     var index = input.indexOf(unit);
     var output = "00"
    if(index < 0){
      return output; // unit isn't in the input
    }

    if(isNaN(input.charAt(index-2))){
      return '0' + input.charAt(index-1);
    }else{
      return input.charAt(index-2) + input.charAt(index-1);
    }
  }

我要持续几个小时,几分钟和几秒钟。如果输入中没有任何内容,我也会减少几个小时,这当然是可选的。

    function ISO8601toDuration(input){
     var H = formatTimeUnit(input, 'H');
     var M = formatTimeUnit(input, 'M');
     var S = formatTimeUnit(input, 'S');

    if(H == "00"){
      H = "";
    }else{
      H += ":"
    }

    return H  + M + ':' + S ;
  }

然后这样称呼它

  duration = ISO8601toDuration(item.duration);

我用它来格式化youtube数据API视频时长。 希望这对某人有帮助