2012-02-15 16 views
11

Scusa il codice approssimativo, sto cercando di visualizzare la durata dei video in base al tempo in secondi. Ho avuto un passaggio sotto ma non funziona correttamente.intervallo di visualizzazione piacevolmente

Desidero che venga visualizzato correttamente, cioè dovrebbe mostrare 9m: 59s non 09m: 59s.

Se le ore sono pari a zero non visualizzano le ore, se i minuti sono pari a zero non visualizzano i minuti.

public static string GetTimeSpan(int secs) 
{ 
    TimeSpan t = TimeSpan.FromSeconds(secs); 

    string answer; 
    if (secs < 60) 
    { 
     answer = string.Format("{0:D2}s", t.Seconds); 
    } 
    else if (secs < 600)//tenmins 
    { 
     answer = string.Format("{0:m}m:{1:D2}s", t.Minutes, t.Seconds); 

    } 
    else if (secs < 3600)//hour 
    { 
     answer = string.Format("{0:mm}m:{1:D2}s", t.Minutes, t.Seconds); 
    } 
    else 
    { 
     answer = string.Format("{0:h}h:{1:D2}m:{2:D2}s", 
            t.Hours, 
            t.Minutes, 
            t.Seconds); 
    } 

    return answer; 
} 
+0

quindi qual è la tua domanda? o cosa ti aspetti che succeda e cosa succede? per favore non aspettarti che indovini :) – Alex

+0

la domanda è la durata del tempo di visualizzazione ben fornita dei secondi. se le ore sono zero non visualizzano le ore, se i minuti sono zero non visualizzano i minuti, inoltre vorrebbero nel formato 9m: 59s non 09m: 59s per i minuti a cifra singola. – raklos

+0

Le stringhe di formato sono errate, non esiste alcun identificatore "m" o "h". Vedere [MSDN] (http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx). Hai a che fare solo con "numeri" e non con "minuti/secondi"! Inoltre, non è necessario specificare esplicitamente "2 posti" per i valori> 10. –

risposta

24

Qualcosa di simile:

public static string PrintTimeSpan(int secs) 
{ 
    TimeSpan t = TimeSpan.FromSeconds(secs); 
    string answer; 
    if (t.TotalMinutes < 1.0) 
    { 
    answer = String.Format("{0}s", t.Seconds); 
    } 
    else if (t.TotalHours < 1.0) 
    { 
    answer = String.Format("{0}m:{1:D2}s", t.Minutes, t.Seconds); 
    } 
    else // more than 1 hour 
    { 
    answer = String.Format("{0}h:{1:D2}m:{2:D2}s", (int)t.TotalHours, t.Minutes, t.Seconds); 
    } 

    return answer; 
} 
+0

Perché utilizzare 't.TotalHours' quando è possibile utilizzare' t.Hours'? –

+4

@FandiSusanto Se l'intervallo è "1 giorno e 2 ore", TotalHours restituirà 26, Ore restituirà 2. –

2

Secondo msdn provare questo:

if (secs < 60) 
{ 
    answer = t.Format("s"); 
} 
else if (secs < 600)//tenmins 
{ 
    answer = t.Format("m:s"); 
} 
// ... 
3

Penso che si possa semplificare questa rimuovendo l'aspetto "D2" del formato e poi hai vinto Ho bisogno di un caso speciale per l'opzione dei meno di dieci minuti. Fondamentalmente solo usando

string.Format("{0}m:{1}s", t.Minutes, t.Seconds); 

otterrà una o due cifre come richiesto. Così il vostro ultimo caso è:

string.Format("{0}h:{1}m:{2}s", t.Hours, t.Minutes, t.Seconds); 
1
readonly static Char[] _colon_zero = { ':', '0' }; 
// ... 

var ts = new TimeSpan(DateTime.Now.Ticks); 
String s = ts.ToString("h\\:mm\\:ss\\.ffff").TrimStart(_colon_zero); 
.0321 
6.0159 
19.4833 
8:22.0010 
1:04:2394 
19:54:03.4883
Problemi correlati