2012-06-18 14 views
76

Sólo por curiosidad, ¿hay una cadena de formato que pueda usar para la producción algo así como "30s 5h 3m"?TimeSpan formato ToString

por ejemplo. (Obviamente erróneo)

myTimeSpan.ToString("hh mm ss") 

Respuesta

126

Probar:

myTimeSpan.ToString("h'h 'm'm 's's'") 

(Tenga en cuenta que incluso los espacios deben ser cita - eso es lo que estaba mal con mi primer intento.)

Te estoy asumiendo' re utilizando .NET 4, por supuesto - antes de eso, TimeSpan no apoyaron las cadenas de formato personalizados.

EDIT: Como se ha señalado, esto no va a trabajar más de 24 horas. También tenga en cuenta que las alternativas están disponibles a través de Noda Time también :)

+3

Consulte la respuesta de Dimension, porque esta no formateará correctamente los tiempos de 24 horas o más. – Scott

+0

"dd'd 'hh'h' mm'm '" - esto funciona para mí. Tenga en cuenta que debe envolver el texto formateado con apóstrofes: "dd'days spent '". Aquí dd es paz de datos y 'días pasó' su propio texto ' –

6

¿qué tal concactenation:

String oTime = myTimeSpan.ToString("h") + "h " + 
       myTimeSpan.ToString("m") + "m " + 
       myTimeSpan.ToString("s") + "s " 

ACTUALIZACIÓN 1:

Puede escapar con comilla simple: h'h 'm'm 's's'

+10

Si va a usar concatenación, también podría usar las propiedades 'Hours',' Minutes', 'Seconds' de IMO. Personalmente preferiría usar una cadena de formato personalizado, después de descifrar las citas. –

28

ser conscientes de esta al usar la respuesta de Jon Skeet, con un código como este:

// 12 days, 23 hours, 24 minutes, 2 seconds. 
TimeSpan span = new TimeSpan(12, 23, 24, 2); 
// 27 hours, 24 minutes, 2 seconds 
TimeSpan span2 = new TimeSpan(27,24,2); 

string format = span.ToString("h'h 'm'm 's's'"); 
string format2 = span2.ToString("h'h 'm'm 's's'"); 
Console.WriteLine(format); 
Console.WriteLine(format2); 
Console.ReadLine(); 

Se obtienen resultados como los siguientes:

23h 24m 2s 
3h 24m 2s 

el formato de horas, puede como máximo espectáculo de 23 horas. No mostrará 27 horas o convertir los 12 días a horas, simplemente cortarlos como si nunca hubieran existido.

Una forma de solucionar este problema sería la creación de una extensión que comprueba la longitud de la TimeSpan y crea el formato basado en si el intervalo de tiempo es más de un año, día, ect. O simplemente siempre se puede mostrar días así porque nunca se cortan:

string newFormat = span.ToString("d'd 'h'h 'm'm 's's'"); 

hacer la nota que soy un principiante en la programación. Esto solo viene de observaciones después de que tuve la suerte de notar esto después de haber supuesto que mostraría todas las horas. Lo digo porque no sé si hay una solución mejor, como otro formato de hora que puede mostrar horas interminables.

sin embargo yo creo que este formato está haciendo su funcionalidad prevista. Solo tienes que ser consciente de ello. Por lo tanto esta publicación. La respuesta de Jon Skeet nunca indicó que este formato muestre solo la propiedad de hora de un formato de tipo de fecha donde las horas pueden ser como máximo 23.

+9

Es por eso que tienes 'TotalHours', etc. en TimeSpan. Probablemente querías este 'Math.Floor (span.TotalHours) + span.ToString (" 'h' m'm 's's' ")' – Aximili

15

Si tiene la mala suerte de no estar usando.NET4:

string.Format("{0}h{1}m{2}s", 
    myTimeSpan.Hours, 
    myTimeSpan.Minutes, 
    myTimeSpan.Seconds); 
+8

Para el código que necesita soportar> 24h, esta solución con 'TotalHours' sigue siendo la camino a seguir, incluso en versiones más recientes de .net. – CodesInChaos

+1

De hecho, esto es mejor ya que puedes confiar en él. –

+0

Tenga cuidado si usa 'TotalHours', ya que es un' doble', no un 'int' como' Hours', es decir, mostrará fracciones de horas así como horas completas. – Jinlye

4

Este pequeño código de ayuda, para analizar y volver a revertir:

 var t = TimeSpan.FromMilliseconds(450780); 

     double d1 = t.TotalSeconds; 


     string t3 = t.ToString(@"hh\:mm\:ss\.f",null); 


     var tt = TimeSpan.ParseExact(t3, @"hh\:mm\:ss\.f",null); 
     double d2 = tt.TotalSeconds; 

Referance for timespan parse

2

usando Xamarin y .NET Portable 4.5 este era el único formato me trabajando después de probar todas las otras respuestas aquí :

timespan.ToString("hh':'mm':'ss"); 

Essenti aliado pongo el : entre comillas simples para escapar de ellos.