Respuestas:
Tratar:
myTimeSpan.ToString("h'h 'm'm 's's'")
(Tenga en cuenta que incluso los espacios deben estar entrecomillados, eso es lo que estaba mal en mi primer intento).
Supongo que está usando .NET 4, por supuesto; antes de eso, TimeSpanno admitía cadenas de formato personalizado.
EDITAR: Como se señaló, esto no funcionará más allá de las 24 horas. También tenga en cuenta que las alternativas también están disponibles a través de Noda Time :)
Tenga en cuenta esto cuando use 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();
Obtienes resultados como estos:
23h 24m 2s
3h 24m 2s
El formato de hora puede mostrar como máximo 23 horas. No mostrará 27 horas ni convertirá los 12 días en horas, simplemente los cortará como si nunca hubieran existido.
Una forma de solucionar esto sería crear una extensión que verifique la duración del TimeSpan y cree un formato en función de si el período de tiempo es superior a un año, día, etc. O simplemente siempre puede mostrar los días también porque nunca se cortan:
string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");
Tenga en cuenta que soy un principiante en la programación. Esto solo proviene de observaciones después de que tuve la suerte de notar esto después de haber asumido que se mostraría todas las horas. Digo esto porque no sé si existe una solución mejor, como otro formato de hora que puede mostrar horas interminables.
Sin embargo, creo que este formato está cumpliendo su función prevista. Solo tienes que ser consciente de ello. Así este post. La respuesta de Jon Skeet nunca indicó que este formato es mostrar solo la propiedad de hora de un formato de tipo de fecha donde las horas pueden ser como máximo 23.
TotalHoursetc. en TimeSpan. Probablemente querías estoMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Si tiene la mala suerte de no utilizar .NET4:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
TotalHourssigue siendo el camino a seguir incluso en las versiones más nuevas de .net.
TotalHours, ya que es un double, no un intigual Hours, es decir, mostrará fracciones de horas y horas completas.
que tal la concatenación:
String oTime = myTimeSpan.ToString("h") + "h " +
myTimeSpan.ToString("m") + "m " +
myTimeSpan.ToString("s") + "s "
ACTUALIZACIÓN 1:
Puede escapar con comillas simples: h'h 'm'm 's's'
Hours, Minutes, Secondspropiedades de la OMI. Personalmente, prefiero usar una cadena de formato personalizado, después de averiguar las citas.
Este pequeño código ayuda, para analizar y 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;
Usando Xamariny .NET Portable 4.5este fue el único formato en el que trabajé después de probar todas las demás respuestas aquí:
timespan.ToString("hh':'mm':'ss");
Básicamente, estoy poniendo las :comillas simples para escapar de ellas.
A veces encuentro cadenas de formato un poco como expresiones regulares, en el sentido de que cuando vuelvo al código más tarde, me olvido de los matices. Por lo tanto, he optado por lo siguiente, que es menos probable que me devuelva la documentación:
string FormatTimeSpan(TimeSpan timeSpan) =>
$"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";
La interpolación de cadenas, introducida en C # 6, hace que esto sea mucho más claro de lo que sería de otra manera.