Flutter:移除时间格式前导零或转换为分钟/小时格式
当然可以用正则表达式来实现这两种需求!下面我会分别针对移除前导零和转换为分钟/小时格式这两个场景,结合你给出的示例要求,给出具体的正则方案+代码实现,确保完全贴合你的预期结果~
一、移除前导零的正则实现
先拆解下你要的规则:
- 小时为
00时,直接去掉小时段,再处理分钟的前导零(比如00:03:15→3:15,00:42:32→42:32) - 小时为
0x时,去掉小时的前导零(比如04:00:00→4:00:00) - 小时非零且无前导零(比如
10:10:10)保持不变 - 全零时间
00:00:00要转为0:00,00:00:xx转为0:xx
我们可以用正则配合少量逻辑判断来实现,代码示例(以JavaScript为例):
function removeLeadingZero(timeStr) { // 先处理小时的单个前导零(0x:xx:xx → x:xx:xx) let processed = timeStr.replace(/^0(?=\d:)/, ''); // 处理小时为00的情况,拆分分钟和秒段 processed = processed.replace(/^00:(0?)(\d+):(\d+)/, (_, leadingZero, minute, second) => { // 如果分钟是00,返回0:秒段 if (minute === '0') { return `0:${second}`; } // 否则去掉分钟的前导零,返回分钟:秒 return `${leadingZero ? minute : minute}:${second}`; }); // 单独处理全零的特殊情况 return processed.replace(/^00:00:00$/, '0:00'); }
测试你的示例:
removeLeadingZero('00:03:15')→3:15removeLeadingZero('10:10:10')→10:10:10removeLeadingZero('00:00:00')→0:00removeLeadingZero('04:00:00')→4:00:00removeLeadingZero('00:42:32')→42:32removeLeadingZero('00:00:18')→0:18removeLeadingZero('00:00:08')→0:08
二、转换为分钟/小时格式的正则实现
你的转换规则示例:
- 小时为
00且秒为00:显示「分钟数 min」(00:07:00→7 min) - 小时为
00且秒非00:显示「分钟:秒 min」(00:10:30→10:30 min) - 小时非零且秒为
00:显示「小时数h 分钟数 min」(01:40:00→1h 40 min)
这里我们用正则捕获时间的时、分、秒三段,再根据数值判断生成结果,代码示例:
function convertToHourMin(timeStr) { // 用正则捕获HH:mm:ss的三个部分 const timeMatch = timeStr.match(/^(\d{2}):(\d{2}):(\d{2})$/); if (!timeMatch) return timeStr; // 不符合格式的直接返回原字符串 const [_, hourStr, minuteStr, secondStr] = timeMatch; const hour = parseInt(hourStr, 10); const second = parseInt(secondStr, 10); if (hour === 0) { if (second === 0) { return `${parseInt(minuteStr, 10)} min`; } else { return `${minuteStr}:${secondStr} min`; } } else { // 小时非零的情况,按示例返回「Xh Y min」 return `${hour}h ${parseInt(minuteStr, 10)} min`; } }
测试你的示例:
convertToHourMin('00:07:00')→7 minconvertToHourMin('00:10:30')→10:30 minconvertToHourMin('01:40:00')→1h 40 min
如果需要支持更多边缘场景(比如01:05:30这种带秒的非零小时情况),只需要在else分支里补充逻辑即可,比如返回${hour}h ${minuteStr}:${secondStr} min。
内容的提问来源于stack exchange,提问作者selected
相关产品推荐
相关产品推荐

