如何简洁格式化TimeSpan,仅输出必要时间信息?
简洁格式化TimeSpan为仅含必要信息的字符串
当然有更简洁的实现方式,你可以通过自定义TimeSpan扩展方法来封装逻辑,避免冗余的if-else分支,同时保证代码的复用性。以下提供两种贴合需求的方案:
方案1:匹配原逻辑,按最大单位显示全量下级单位
这个方案和你原本的逻辑完全对齐:当时长达到某一单位(天/小时/分钟)时,显示该单位及所有更小的单位,不足一分钟时仅显示秒。
public static class TimeSpanExtensions { public static string ToFormattedDuration(this TimeSpan duration) { if (duration.Days > 0) return $"{duration:dd' days 'hh' hours 'mm' min 'ss\\.f' sec'}"; if (duration.Hours > 0) return $"{duration:hh' hours 'mm' min 'ss\\.f' sec'}"; if (duration.Minutes > 0) return $"{duration:mm' min 'ss\\.f' sec'}"; return $"{duration:ss\\.f' sec'}"; } }
使用示例
var duration1 = TimeSpan.FromSeconds(90); Console.WriteLine(duration1.ToFormattedDuration()); // 输出:01 min 30.0 sec var duration2 = TimeSpan.FromHours(1.5); Console.WriteLine(duration2.ToFormattedDuration()); // 输出:01 hours 30 min 00.0 sec var duration3 = TimeSpan.FromDays(2); Console.WriteLine(duration3.ToFormattedDuration()); // 输出:02 days 00 hours 00 min 00.0 sec var duration4 = TimeSpan.FromSeconds(45); Console.WriteLine(duration4.ToFormattedDuration()); // 输出:45.0 sec
方案2:仅显示非零单位,更紧凑的输出
如果希望进一步精简,只显示有实际值的单位(比如1小时不显示00 min),可以用动态拼接单位的方式:
public static class TimeSpanExtensions { public static string ToCondensedDuration(this TimeSpan duration) { var parts = new List<string>(); if (duration.Days > 0) parts.Add($"{duration.Days} day{(duration.Days != 1 ? "s" : "")}"); if (duration.Hours > 0) parts.Add($"{duration.Hours:D2} hour{(duration.Hours != 1 ? "s" : "")}"); if (duration.Minutes > 0) parts.Add($"{duration.Minutes:D2} min{(duration.Minutes != 1 ? "s" : "")}"); // 始终显示秒(含小数部分) var totalSeconds = duration.TotalSeconds; parts.Add($"{totalSeconds:0.0} sec{(Math.Abs(totalSeconds - 1) > 0.01 ? "s" : "")}"); return parts.Any() ? string.Join(" ", parts) : "0.0 secs"; } }
使用示例
var duration1 = TimeSpan.FromHours(1); Console.WriteLine(duration1.ToCondensedDuration()); // 输出:01 hours 0.0 secs var duration2 = TimeSpan.FromMinutes(45); Console.WriteLine(duration2.ToCondensedDuration()); // 输出:45 mins 0.0 secs var duration3 = TimeSpan.FromDays(1).AddHours(2).AddSeconds(30.5); Console.WriteLine(duration3.ToCondensedDuration()); // 输出:1 day 02 hours 30.5 secs
这两种方案都比原生的多分支if-else更简洁,且通过扩展方法封装后,整个项目都能直接调用,无需重复写逻辑。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

