关于c#:Timespan格式化

Timespan formatting

本问题已经有最佳答案,请猛点这里访问。

当您将时间跨度声明为"1小时10分钟"时,如何优雅地将其格式化为示例"1小时10分钟"?

1
TimeSpan t = new TimeSpan(0, 70, 0);

我当然知道你可以为这个做一些简单的数学,但我有点希望.NET中有一些东西可以为我处理这个-对于更复杂的场景。

如何设置字符串的副本。在.NET中使用自定义格式设置TimeSpan对象的格式?


这没有内置功能,您需要使用自定义方法,例如:

1
2
3
4
5
6
TimeSpan ts = new TimeSpan(0, 70, 0);
String.Format("{0} hour{1} {2} minute{3}",
              ts.Hours,
              ts.Hours == 1 ?"" :"s",
              ts.Minutes,
              ts.Minutes == 1 ?"" :"s")


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static string Pluralize(int n, string unit)
{
    if (string.IsNullOrEmpty(unit)) return string.Empty;

    n = Math.Abs(n); // -1 should be singular, too

    return unit + (n == 1 ? string.Empty :"s");
}

public static string TimeSpanInWords(TimeSpan aTimeSpan)
{
    List<string> timeStrings = new List<string>();

    int[] timeParts = new[] { aTimeSpan.Days, aTimeSpan.Hours, aTimeSpan.Minutes, aTimeSpan.Seconds };
    string[] timeUnits = new[] {"day","hour","minute","second" };

    for (int i = 0; i < timeParts.Length; i++)
    {
        if (timeParts[i] > 0)
        {
            timeStrings.Add(string.Format("{0} {1}", timeParts[i], Pluralize(timeParts[i], timeUnits[i])));
        }
    }

    return timeStrings.Count != 0 ? string.Join(",", timeStrings.ToArray()) :"0 seconds";
}


从这里复制了我自己的答案:如何将时间跨度转换为格式化字符串?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static string ToReadableAgeString(this TimeSpan span)
{
    return string.Format("{0:0}", span.Days / 365.25);
}

public static string ToReadableString(this TimeSpan span)
{
    string formatted = string.Format("{0}{1}{2}{3}",
        span.Duration().Days > 0 ? string.Format("{0:0} days,", span.Days) : string.Empty,
        span.Duration().Hours > 0 ? string.Format("{0:0} hours,", span.Hours) : string.Empty,
        span.Duration().Minutes > 0 ? string.Format("{0:0} minutes,", span.Minutes) : string.Empty,
        span.Duration().Seconds > 0 ? string.Format("{0:0} seconds", span.Seconds) : string.Empty);

    if (formatted.EndsWith(",")) formatted = formatted.Substring(0, formatted.Length - 2);

    if (string.IsNullOrEmpty(formatted)) formatted ="0 seconds";

    return formatted;
}

我喜欢约翰正在研究的答案。这就是我想到的。

1
Convert.ToDateTime(t.ToString()).ToString("h "Hour(s)" m "Minute(s)" s "Second(s)"");

不考虑天数,因此如果需要,您需要添加。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static string GetDurationInWords( TimeSpan aTimeSpan )
{
    string timeTaken = string.Empty;

    if( aTimeSpan.Days > 0 )
        timeTaken += aTimeSpan.Days +" day" + ( aTimeSpan.Days > 1 ?"s" :"" );

    if( aTimeSpan.Hours > 0 )
    {
        if( !string.IsNullOrEmpty( timeTaken ) )
           timeTaken +="";
        timeTaken += aTimeSpan.Hours +" hour" + ( aTimeSpan.Hours > 1 ?"s" :"" );
    }

    if( aTimeSpan.Minutes > 0 )
    {
       if( !string.IsNullOrEmpty( timeTaken ) )
           timeTaken +="";
       timeTaken += aTimeSpan.Minutes +" minute" + ( aTimeSpan.Minutes > 1 ?"s" :"" );
    }

    if( aTimeSpan.Seconds > 0 )
    {
       if( !string.IsNullOrEmpty( timeTaken ) )
           timeTaken +="";
       timeTaken += aTimeSpan.Seconds +" second" + ( aTimeSpan.Seconds > 1 ?"s" :"" );
    }

    if( string.IsNullOrEmpty( timeTaken ) )
        timeTaken ="0 seconds.";

     return timeTaken;
}