将ISO 8601时间格式转换为常规时间持续时间

7
我有一个持续时间字符串 "PT1M33S"。 我想要在以下格式中得到结果 -> 01:33 请问是否可以使用 JavaScript 或 jQuery 实现?

1
"PT1M:33S" 看起来不像是有效的 ISO 8601 日期格式。最接近的格式应该是 "YYYY-MM-DDTHH:mm:ss"。 - Pavlo
实际上,我正在获取YouTube视频,并且我得到的视频持续时间为“PT1M33S”。现在我需要将其转换为普通时间格式。 - user2091061
你可以使用简单的正则表达式来解析它。或者你可以查看 YouTube API 提供的 durationMs(以毫秒为单位的持续时间)值是否更适合你的需求... - CBroe
2
记录一下,这确实是有效的ISO8601格式。请参阅https://en.wikipedia.org/wiki/ISO_8601#Durations。 - jezmck
4个回答

19

这似乎不是一个时间格式,而只是视频的持续时间。

     ------ 33 Seconds
    ''
PT1M33S
  '------- 1 Minute

H - 小时
M - 分钟
S - 秒

所以试试这个

var timeD = "PT1M33S";
var formattedTime = timeD.replace("PT","").replace("H",":").replace("M",":").replace("S","")
alert(formattedTime);

Fiddle 例如, 也可以通过简单的正则表达式来实现。

希望您能理解。


但无法处理单个数字的分钟或秒 - "PT2H1M5S" - 2:1:5 - mhlavacka
@mhlavacka 是的,我也这么认为。2H1M5S的意思是2:1:5 - Praveen

5

您可以匹配数字并将它们填充到格式中 -

var string= "PT1M33S", 
array=string.match(/(\d+)(?=[MHS])/ig)||[]; 

var formatted=array.map(function(item){
    if(item.length<2) return '0'+item;
    return item;
}).join(':');

formatted

/* 返回值:(字符串) 01:33*/


2
我个人使用这个:
function parseDuration(e){var n=e.replace(/D|H|M/g,":").replace(/P|T|S/g,"").split(":");if(1==n.length)2!=n[0].length&&(n[0]="0"+n[0]),n[0]="0:"+n[0];else for(var r=1,l=n.length-1;l>=r;r++)2!=n[r].length&&(n[r]="0"+n[r]);return n.join(":")}

同一代码格式化:

function parseDuration(e){
    var n = e.replace(/D|H|M/g,":").replace(/P|T|S/g,"").split(":");

    if(1 == n.length)
        2!=n[0].length && (n[0]="0"+n[0]),n[0]="0:"+n[0];
    else 
        for(var r=1, l=n.length-1; l>=r;r++)
            2!=n[r].length && (n[r]="0"+n[r]);

    return n.join(":")
}

0

我喜欢这个答案,因为它很简单,但是如果分钟或秒钟少于10,它会产生奇怪的结果,例如,10:04会返回为10:4。

所以我添加了一些简单的函数来进一步解析和重新组合时间字符串:

function formatTimeSeg(segment) {
    newSegment = segment;
    segLength = segment.length;
    if(segLength==1){
        newSegment = '0'+segment;
    }
return newSegment;
}
extractedTime = duration.replace("PT","").replace("H",":").replace("M",":").replace("S","")
extractedTime = extractedTime.split(':');
timeLength = extractedTime.length;
switch(timeLength) {
    case 3:
        hours=extractedTime[0];minutes=extractedTime[1];seconds=extractedTime[2];
        minutes = formatTimeSeg(minutes);
        seconds = formatTimeSeg(seconds);
        formattedTime = hours+':'+minutes+':'+seconds;
    break;
    case 2:
        minutes=extractedTime[0];seconds=extractedTime[1];
        minutes = formatTimeSeg(minutes);
        seconds = formatTimeSeg(seconds);
        formattedTime = minutes+':'+seconds;
    break;
    case 1:
        seconds=extractedTime[0];
        seconds = formatTimeSeg(seconds);
        formattedTime = '0:'+seconds;
    break
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接