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
相关产品推荐
相关产品推荐

