2011-04-18 16 views
8

El siguiente códigoCómo dar formato a un intervalo de tiempo durante horas no días

Console.WriteLine("{0:%h} hours {0:%m} minutes", 
        new TimeSpan(TimeSpan.TicksPerDay)); 

produce esta salida:

0 horas 0 minutos

Lo que me gustaría es esta salida:

24 horas 0 minutos

¿Qué me falta en este formato de cadena?

P.S. Sé que podría destruir manualmente el TimeSpan en días y horas, y multiplicar los dos, pero preferiría usar una cadena de formato personalizado, ya que estos intervalos de tiempo se muestran en una cuadrícula de datos silverlight y la gente espera ver horus, no días.

Respuesta

13

Según MSDN, utilizando %h le

muestran el número de horas enteras en el intervalo de tiempo que no se cuentan como parte de días.

creo que tendrá que utilizar la propiedad TotalHours del TimeSpan clase como:

TimeSpan day= new TimeSpan(TimeSpan.TicksPerDay); 
Console.WriteLine("{0} hours {1} minutes", (int)day.TotalHours, day.Minutes); 

actualización

Si es absolutamente necesario ser capaz de alcanzar el indicado formatee pasando formateadores personalizados al método ToString, probablemente necesite crear su propio CustomTimeSpan clas s. Desafortunadamente, no puedes heredar de un struct, por lo que tendrás que construirlo desde cero.

+0

Gracias por la actualización --- eso es lo que me empujó al límite hacia un tipo personalizado. –

+1

es posible que deba truncarlo, de lo contrario, la propiedad total no mostrará la cifra correcta. Dim x As New TimeSpan (0, 0, 3600) String.Format ("{0} hr: {1} min", CInt (Math.Truncate (x.TotalHours)), x.Minutes) – user1263981

10

No parece haber una opción de formato para obtener el total de horas de un TimeSpan. Su mejor opción sería utilizar la propiedad TotalHours lugar:

var mySpan = new TimeSpan(TimeSpan.TicksPerDay); 
Console.WriteLine("{0} hours {1} minutes", (int)mySpan.TotalHours, mySpan.Minutes); 

TotalHours devuelve un doble, ya que incluye las horas fraccionadas por lo que necesita para truncar a sólo la parte entera.

+0

Derecho, como dije, sé que puedo romper el intervalo de tiempo, pero lo que no creo que pueda hacer con este enfoque es formatear el intervalo de tiempo con una cadena de formato pasada a su Método ToString. –

+0

@Ralph - Sí, estás "revienta" el 'TimeSpan' pero no se necesita multiplicación. – ChrisF

+0

@ChrisF - es cierto, TotalHours es más fácil que Days * 24 + Hours, pero la dificultad persiste. Necesito una cadena de formato. --- y supongo que no es posible. –

Cuestiones relacionadas