Pergunta

Como você elegantemente formatar um período de tempo para dizer exemplo "1 hora e 10 minutos" quando você declarou-o como:

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

?

É claro que estou ciente de que você poderia fazer alguma matemática simples para isso, mas eu estava meio que esperando que há algo em .NET para lidar com isso para mim - para cenários mais complicados

Duplicar de Como posso String.format um objeto TimeSpan com um formato personalizado em .NET?

Foi útil?

Solução

Não há nenhuma funcionalidade interna para isso, você vai precisar usar um método personalizado, algo como:

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

Outras dicas

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

Copiado minha própria resposta a partir daqui: Como faço para converter um TimeSpan para uma string formatada?

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

Eu como a resposta John está trabalhando. Aqui está o que eu vim acima com.

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

não conta para dias assim que você precisa acrescentar que, se você quiser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top