You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android低于API26时,Java 7原生解析ISO 8601时长的方法

解决Android低版本解析YouTube ISO 8601时长的原生方案

嘿,这个问题我太熟悉了!之前做项目时也碰到过没法升级API到26的窘境,Java 8的Duration.parse()确实好用,但无奈低版本Android不支持。不过咱们完全可以自己写一套轻量级的解析逻辑,不用依赖任何高版本API,完美兼容所有旧版本。

先搞懂YouTube的时长格式

YouTube API返回的时长是ISO 8601的简化版,格式都是以PT开头(表示时间段),后面跟着:

  • H:小时(比如PT3H就是3小时)
  • M:分钟(比如PT12M就是12分钟)
  • S:秒(比如PT45S就是45秒)
    这些单位会按小时→分钟→秒的顺序组合,像PT3H12M、PT1H5M30S都是常见格式。

原生解析实现代码

下面是我一直在用的解析方法,逻辑简单,兼容性拉满:

public static long parseYouTubeDurationToMillis(String duration) {
    // 先去掉开头的PT标记
    String timeStr = duration.replace("PT", "");
    
    long hours = 0;
    long minutes = 0;
    long seconds = 0;

    // 提取小时数
    int hIndex = timeStr.indexOf('H');
    if (hIndex != -1) {
        try {
            hours = Long.parseLong(timeStr.substring(0, hIndex));
            // 截取掉小时部分,剩下的继续处理
            timeStr = timeStr.substring(hIndex + 1);
        } catch (NumberFormatException e) {
            // 防止异常,默认设为0(YouTube返回的格式一般不会有问题)
            hours = 0;
        }
    }

    // 提取分钟数
    int mIndex = timeStr.indexOf('M');
    if (mIndex != -1) {
        try {
            minutes = Long.parseLong(timeStr.substring(0, mIndex));
            timeStr = timeStr.substring(mIndex + 1);
        } catch (NumberFormatException e) {
            minutes = 0;
        }
    }

    // 提取秒数
    int sIndex = timeStr.indexOf('S');
    if (sIndex != -1) {
        try {
            seconds = Long.parseLong(timeStr.substring(0, sIndex));
        } catch (NumberFormatException e) {
            seconds = 0;
        }
    }

    // 转换成总毫秒数返回,方便后续处理(比如转成时分秒显示)
    return hours * 3600000 + minutes * 60000 + seconds * 1000;
}

扩展:返回具体的时分秒数值

如果你不需要总毫秒数,而是想要分别获取小时、分钟、秒的数值,可以返回一个自定义实体类:

// 自定义时长类
public class YouTubeDuration {
    public final long hours;
    public final long minutes;
    public final long seconds;

    public YouTubeDuration(long hours, long minutes, long seconds) {
        this.hours = hours;
        this.minutes = minutes;
        this.seconds = seconds;
    }
}

// 对应的解析方法
public static YouTubeDuration parseYouTubeDuration(String duration) {
    String timeStr = duration.replace("PT", "");
    
    long hours = 0;
    long minutes = 0;
    long seconds = 0;

    // 提取小时、分钟、秒的逻辑和上面一致,省略重复代码
    // ...

    return new YouTubeDuration(hours, minutes, seconds);
}

注意事项

  • 异常处理:虽然YouTube API返回的格式都是标准的,但加个try-catch能避免极端情况导致崩溃。
  • 格式覆盖:这个方法能处理所有YouTube可能返回的时长格式,不管是只有小时、只有分钟,还是时分秒都有的情况。

这个方案完全是原生实现,不需要引入任何第三方库,也不用升级API级别,亲测在API 16及以上都能正常运行。

内容的提问来源于stack exchange,提问作者ssindher11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:07:37