如何将“1hr 26min”格式时长转换为纯小时数或拆分时分单位
问题原因
你之前的代码无法生效,核心原因是1hr 26min属于时间跨度(时长)字符串,不是标准的时刻/日期字符串:
DateTime.parse仅能解析符合规范的具体时刻值(比如2024-05-20 13:26这类),无法识别带hr/min单位的时长文本DateFormat.Hm()是用来格式化时刻的「时:分」展示格式,本身就不是为时长处理设计的,用在这里完全不匹配场景。
实现方案
直接用正则表达式匹配字符串里的小时、分钟数字即可,兼容格式不完整的边界情况(比如仅含小时2hr、仅含分钟35min的场景也能正常解析)。
1. 单独拆分提取小时、分钟数值
/// 解析形如"Xhr Ymin"的时长字符串,返回拆分后的小时、分钟整数值 Map<String, int> splitDuration(String durationText) { // 正则匹配对应单位前的数字 final hourReg = RegExp(r'(\d+)hr'); final minReg = RegExp(r'(\d+)min'); final hourValue = int.tryParse(hourReg.firstMatch(durationText)?.group(1) ?? '0') ?? 0; final minValue = int.tryParse(minReg.firstMatch(durationText)?.group(1) ?? '0') ?? 0; return {'hours': hourValue, 'minutes': minValue}; } // 调用示例 final durationMap = splitDuration(FetchList[index].Duration); int hours = durationMap['hours']!; // 拿到单独的小时值,1hr 26min场景下返回1 int minutes = durationMap['minutes']!; // 拿到单独的分钟值,1hr 26min场景下返回26
2. 格式化为纯小时数值
基于拆分后的结果,把分钟部分换算为小时单位相加即可,得到带小数的总小时数:
/// 把时长字符串转换为总小时数值 double parseToTotalHours(String durationText) { final durationMap = splitDuration(durationText); return durationMap['hours']! + durationMap['minutes']! / 60; } // 调用示例 double totalHours = parseToTotalHours(FetchList[index].Duration); // 1hr 26min场景下返回值约为1.43,可根据需要保留小数位数
注意:如果你的时长字符串可能出现带空格、单位单复数(比如
1hrs/26mins)的变体,只要把正则调整为RegExp(r'(\d+)hrs?')、RegExp(r'(\d+)mins?')即可兼容。
内容的提问来源于stack exchange,提问作者GRaw
相关产品推荐
相关产品推荐

