基于指定规则将总分钟数转换为天时分格式的Kotlin代码优化咨询
分钟转天/小时/分钟显示格式的Kotlin优化实现
需求规则
- 舍入规则:剩余分钟数≥30时向上进1小时,<30时舍去。例:6050分钟对应4天4小时50分钟,显示为4d 5h;6090分钟对应4天5小时30分钟,显示为4d 6h;6089分钟对应4天5小时29分钟,显示为4d 5h
- 特殊场景:0d 0h 0m统一显示为0m
- 长时长规则:总小时数>100时,输出不包含分钟单位
现有代码可优化点
- 总小时数计算逻辑错误:原代码中
time * 60.0是分钟转秒的逻辑,转小时应该是time / 60.0,会导致长时长判断完全失效 - 存在大量重复的分支判断,冗余度高
- 字符串拼接逻辑会产生多余空格,比如天数为0时输出内容开头会带空格
- 函数返回值声明为可空
String?无必要,所有分支都有返回值可直接返回非空类型 - 存在多余的字符串转整型判断,可直接用原始数值做判断
优化后代码
fun minutesToDaysHoursMinutes(time: Double): String { // 处理0时长特殊场景 if (time <= 0) return "0m" val totalMinutes = time.toLong() // 先处理分钟进位逻辑 val adjustedTotalMinutes = if (totalMinutes % 60 >= 30) { totalMinutes + (60 - totalMinutes % 60) } else { totalMinutes - totalMinutes % 60 } val totalHours = adjustedTotalMinutes / 60 val days = totalHours / 24 val hours = totalHours % 24 val minutes = totalMinutes % 60 val parts = mutableListOf<String>() // 长时长判断:总小时数>100不显示分钟 if (totalHours > 100) { if (days > 0) parts.add("${days}d") if (hours > 0) parts.add("${hours}h") } else { if (days > 0) parts.add("${days}d") if (hours > 0) parts.add("${hours}h") parts.add("${minutes}m") } return parts.joinToString(" ") }
优化说明
- 统一前置处理分钟进位逻辑,后续无需再重复判断分钟值
- 用列表收集时间单位部分,
joinToString自动处理空格拼接,不会产生多余空格 - 分支逻辑大幅简化,可读性和可维护性更高
- 修复了原代码总小时数计算的bug,长时长判断逻辑准确
- 覆盖所有边界场景,包括0时长的特殊处理
内容的提问来源于stack exchange,提问作者Jaimin Modi
相关产品推荐
相关产品推荐

