26 Stimmen

Formatierung der Zeitspanne

Wie kann man eine Zeitspanne elegant formatieren, z.B. "1 Stunde 10 Minuten", wenn man sie als :

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

?

Ich bin natürlich bewusst, dass Sie einige einfache Mathematik für diese tun könnte, aber ich war irgendwie gehofft, dass es etwas in .NET, dies für mich zu behandeln - für kompliziertere Szenarien

Duplizieren Sie von Wie kann ich String.Format ein TimeSpan-Objekt mit einem benutzerdefinierten Format in .NET?

21voto

John Rasch Punkte 60054

Hierfür gibt es keine eingebaute Funktion, Sie müssen eine eigene Methode verwenden, etwa so:

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")

13voto

Chris Doggett Punkte 18701
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";
}

5voto

Peter Punkte 13799

Ich habe meine eigene Antwort von hier kopiert: Wie konvertiere ich einen TimeSpan in eine formatierte Zeichenfolge?

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;
}

1voto

Partha Choudhury Punkte 550
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;
}

1voto

Crispy Punkte 5477

Mir gefällt die Antwort, an der John gerade arbeitet. Hier ist, was ich mir ausgedacht habe.

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

Die Tage werden nicht berücksichtigt, so dass Sie diese hinzufügen müssen, wenn Sie dies wünschen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X