2011-01-17 15 views
11

Tengo un intervalo de tiempo, ts, que tiene en su mayoría minutos y segundos, pero a veces horas. me gustaría ts para devolver una cadena con formato que va a dar los siguientes resultados:TimeSpan FormatString con horas opcionales

3:30 (hours not displayed, showing only full minutes) 
13:30 
1:13:30 (shows only full hours instead of 01:13:30) 

hasta ahora tengo:

string TimeSpanText = string.Format("{0:h\\:mm\\:ss}", MyTimeSpan); 

pero no está dando los resultados anteriores. ¿Cómo puedo lograr los resultados que quiero?

+0

Lo que quiere y lo que obtiene no está claro? –

+0

Estoy buscando la cadena de formato que devolverá una cadena con el formato anterior. – frenchie

Respuesta

6

no creo que una cadena de formato único le dará lo que quiere, pero la construcción de la salida de uno mismo es una tarea sencilla:

public string FormatTimeSpan(TimeSpan ts) 
{ 
    var sb = new StringBuilder(); 

    if ((int) ts.TotalHours > 0) 
    { 
     sb.Append((int) ts.TotalHours); 
     sb.Append(":"); 
    } 

    sb.Append(ts.Minutes.ToString("m")); 
    sb.Append(":"); 
    sb.Append(ts.Seconds.ToString("ss")); 

    return sb.ToString(); 
} 

EDIT: ¡Mejor idea!

Usted podría hacer que el método anterior un método de extensión de la clase TimeSpan así:

public static class Extensions 
{ 
    public static string ToMyFormat(this TimeSpan ts) 
    { 
     // Code as above. 
    } 
} 

a continuación, utilizando esto es tan simple como la invocación de ts.ToMyFormat().

+0

¡Me encanta la idea de crear un método de extensión! – frenchie

+0

Hay un pequeño error de lógica; si los segundos están entre 0 y 9, la salida de 5 minutos y 3 segundos se ve como 5: 3 en lugar de 5:03. Estoy trabajando en ello. Gracias por mostrarme cómo funcionan los métodos de extensión; lees sobre ellos, pero cuando construyes los tuyos por primera vez, ves cómo realmente funcionan para ti. Gracias. – frenchie

+0

Aquí están los segundos: if (ts.Seconds <10) {sb.Append (": 0"); } else {sb.Append (":"); } – frenchie

10

tal vez quiere algo así como

string TimeSpanText = string.Format(
    MyTimeSpan.TotalHours >= 1 ? @"{0:h\:mm\:ss}" : @"{0:mm\:ss}", 
    MyTimeSpan);