2009-05-08 23 views
26

¿Cómo se formatea con elegancia un intervalo de tiempo de decir ejemplo "1 hora y 10 minutos" cuando se ha declarado como:Timespan formato

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

?

Por supuesto, soy consciente de que usted podría hacer algunas matemáticas simples para esto, pero yo estaba un poco la esperanza de que hay algo en .NET para manejar esto para mí - para los escenarios más complicados

Duplicar de How can I String.Format a TimeSpan object with a custom format in .NET?

Respuesta

20

no hay ninguna funcionalidad integrada para esto, usted tendrá que utilizar un método personalizado, algo así 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") 
+1

vergüenza, por desgracia, a veces, el tiempo puede ser <1 hora, por lo que suele bastante hacerlo. Supongo que tendré que hacer un poco de iffing :) Ty de todos modos – qui

+0

Cuando es <1 hora, modifique la condición de este ts.Hours == 1? "": "s", a este ts.Hours <= 1? "": "s", –

+0

@jalchr: Plural es correcto para valores cero, así que déjalo como '== 1'. p.ej. 0 horas, 0 minutos es correcto. –

1
 
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; 
} 
+6

¡Su código grita por refactorizar! – TweeZz

1

Me gusta la respuesta en la que John está trabajando. Esto es lo que se me ocurrió.

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

No cuenta los días, por lo que tendría que agregar eso si lo desea.

13
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"; 
} 
+0

Acabo de hacer en mi propio código, tan simple como agregar un "esto" antes del parámetro. –

+2

Deseo que la pluralización en ruso sea tan simple como en inglés =) –

+0

@ MaximV.Pavlov +1 Comentario hilarante> ;-) Me gustaría ver un pluralizador ruso que podría escribir correctamente "2345678" en palabras en el oración "con 2345678 niñas". En realidad, aún no he conocido a un humano que pueda hacerlo sin vacilación. – smirkingman

5

Copiado mi propia respuesta desde aquí: How do I convert a TimeSpan to a formatted string?

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