5

我想以这种方式在 C# 中格式化 TimeSpan:

xxx 天 yyy 小时 zzz 分钟

条件:

  1. 额外的秒数应该被截断

  2. 天是我想要的最大单位。我希望 34 天显示为 34 天,而不是 1 个月 4 天等。

  3. 如果时间跨度小于一天,我不希望出现一天部分。同样,如果跨度小于 1 小时,我只想显示分钟部分。

有什么办法可以使用内置格式字符串来做到这一点,或者除了编写自己的函数之外别无他法?

编辑:目前为此使用我自己的功能。以分钟为单位的 TimeSpan 作为输入(TimeSpan.TotalMinutes)

private static string GetTimeStringFromMinutes(double p)
        {
            var minutes = (int) p;
            int hours = minutes / 60;
            minutes = minutes % 60;
            int days = hours/24;
            hours = hours%24;
            string dayPart = days + " day(s) ";
            string hoursPart = hours + " hour(s) ";
            string minutesPart = minutes + " minute(s)";
            if (days != 0)
                return (dayPart + hoursPart + minutesPart);
            if (hours != 0)
                return (hoursPart + minutesPart);
            return (minutesPart);
        }
4

4 回答 4

7

TimeSpan 在 .NET 4.0 之前根本没有格式化选项,您必须通过 Ticks 属性将其转换为 DateTime。但是,在 DateTime.String(format) 格式化选项中没有任何东西可以远程关闭,您必须自己编写。

在 .NET 4.0 中,TimeSpan 获得了一个 ToString(format) 覆盖。此处描述了自定义格式字符串。您的第三个要求将需要代码。

于 2010-08-20T09:59:38.403 回答
5

在 .NET 3.5 及更早版本中,您需要编写自己的函数。

在 .NET 4 中添加了对格式的支持TimeSpan,请参阅TimeSpan.ToString(string)详细信息。

于 2010-08-20T09:50:32.927 回答
3

至少在 .NET 3.5 中没有任何内置方法可以满足您的要求。这是一个扩展 的类TimeSpan以提供您想要的功能。

public static class TimeSpanEx
{
    public static string FormattedString(this TimeSpan ts)
    {
        int days = (int)ts.TotalDays;
        int hrs = (int)ts.Hours;
        int mins = (int)ts.Minutes;
        StringBuilder sb = new StringBuilder();

        if (days > 0)
        {
            sb.Append(days.ToString() + (days == 1 ? " day, " : " days, "));
        }

        if (hrs > 0 || days > 0)
        {
            sb.Append(hrs.ToString() + (hrs == 1 ? " hour, " : " hours, "));
        }

        sb.Append(mins.ToString() + (mins == 1 ? " min" : " mins"));

        return sb.ToString();
    }
}
于 2010-08-20T10:32:54.123 回答
2

不幸的是,.Net 中没有任何东西可以直接使用。对于我自己,我已经通过这种方式解决了这个问题:

public static class TimeSpanExtensions
{
    public static string ToDetailedString(this TimeSpan timeSpan)
    {
        if (timeSpan == null)
            throw new ArgumentNullException("timeSpan");

        var sb = new StringBuilder(30);

        var current = timeSpan.ToDaysString();

        if (!String.IsNullOrEmpty(current))
            sb.Append(current);

        current = timeSpan.ToHoursString();

        if (!String.IsNullOrEmpty(current))
        {
            if (sb.Length > 0)
                sb.Append(" ");

            sb.Append(current);
        }

        current = timeSpan.ToMinutesString();

        if (!String.IsNullOrEmpty(current))
        {
            if (sb.Length > 0)
                sb.Append(" ");

            sb.Append(current);
        }

        return sb.ToString();
    }

    public static string ToDaysString(this TimeSpan timeSpan)
    {
        if (timeSpan == null)
            throw new ArgumentNullException("timeSpan");

        int days = (int)timeSpan.TotalDays;

        switch (days)
        {
            case 0:
                return String.Empty;
            case 1:
                return "1 day";
            default:
                return days + " days";
        }
    }

    public static string ToHoursString(this TimeSpan timeSpan)
    {
        if (timeSpan == null)
            throw new ArgumentNullException("timeSpan");

        switch (timeSpan.Hours)
        {
            case 0:
                return String.Empty;
            case 1:
                return "1 hour";
            default:
                return timeSpan.Hours + " hours";
        }
    }

    public static string ToMinutesString(this TimeSpan timeSpan)
    {
        if (timeSpan == null)
            throw new ArgumentNullException("timeSpan");

        switch (timeSpan.Minutes)
        {
            case 0:
                return String.Empty;
            case 1:
                return "1 minute";
            default:
                return timeSpan.Minutes + " minutes";
        }
    }
}

也许这不是最优雅的解决方案,我认为可以做一些改进,特别是在ToDetailedString()功能上,但它工作得非常好。

于 2010-08-20T10:11:11.037 回答