如何正确格式化取自 Youtube API Java (android) 的 Youtube 视频时长

How to properly format a Youtube video duration in Java (android) taken from Youtube API

我们在 android 中有这个电话:

https://www.googleapis.com/youtube/v3/videos?id=7nwwdhZzVro&part=contentDetails,statistics&key=YOUR_KEY

结果如下:

{
"kind": "youtube#videoListResponse",
"etag": "\"SJZWTG6xR0eGuCOh2bX6w3s4F94/VOhpy08pTLV0gkKEHqgFjpTWvRY\"",
"pageInfo": {
    "totalResults": 1,
    "resultsPerPage": 1
},
"items": [{
    "kind": "youtube#video",
    "etag": "\"SJZWTG6xR0eGuCOh2bX6w3s4F94/zatyJpHwm5XYTpovyREQKk3FNh0\"",
    "id": "7nwwdhZzVro",
    "contentDetails": {
        "duration": "PT5M46S",
        "dimension": "2d",
        "definition": "hd",
        "caption": "false",
        "licensedContent": true,
        "projection": "rectangular"
    },
    "statistics": {
        "viewCount": "261804",
        "likeCount": "3069",
        "dislikeCount": "47",
        "favoriteCount": "0",
        "commentCount": "67"
    }
}]
}

假设我已将该值保存到名为 String videoDuration 的变量中,我如何才能将 videoDuration 正确格式化为 00:00mm:ss?在我的例子中,它应该显示 05:46

这似乎遵循了iso8601 duration format

String videoDuration = "PT5M46S";
Duration dur = Duration.parse(videoDuration);
String strTime;
if (dur.toHours() > 0) {
    strTime = String.format("%d:%02d:%02d", 
                        dur.toHours(), 
                        dur.toMinutesPart(), 
                        dur.toSecondsPart());
} else {
    strTime = String.format("%02d:%02d",
                        dur.toMinutesPart(), 
                        dur.toSecondsPart());
}
System.out.println(strTime);

这输出:

05:46

我会检查小时数,因为一些 YouTube 视频的持续时间超过一个小时,这样 PT1H15M2S 会输出 1:15:02

注意toMinutesPart()toSecondsPart()来自java9,如果你还在使用java8你仍然可以使用Duration来解析它但你必须检查其他格式化方式。

就我而言 android 工作室给了我一个警告: Call requires API level 26 (Current min is 21)

所以我在 JODA time 上取得了成功:

private String FormatdDate(String time) {
    Period dur = Period.parse(time);
    String strTime;
    if (dur.getHours() > 0) {
        strTime = String.format("%d:%02d:%02d",
                dur.getHours(),
                dur.getMinutes(),
                dur.getSeconds());
    } else {
        strTime = String.format("%02d:%02d",
                dur.getMinutes(),
                dur.getSeconds());
    }
    return strTime;
}