You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简洁格式化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:30:20