Formato TimeSpan ToString

95

Solo por curiosidad, ¿hay una cadena de formato que pueda usar para generar algo como "5h 3m 30s"?

p.ej. (obviamente mal)

myTimeSpan.ToString("hh mm ss")
Aximili
fuente

Respuestas:

143

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 :)

Jon Skeet
fuente
5
Vea la respuesta de Dimension, porque este no formateará correctamente tiempos de 24 horas o más.
Scott
"dd'd 'hh'h' mm'm '" - esto funciona para mí. Tenga en cuenta que debe envolver el texto formateado con apóstrofos: "dd'days gastados '". Aquí dd es paz de datos y 'días pasados' su propio texto '
Pavel Shkleinik
37

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.

Dimensión
fuente
14
Es por eso que tiene TotalHoursetc. en TimeSpan. Probablemente querías estoMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili
17

Si tiene la mala suerte de no utilizar .NET4:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);
Holf
fuente
9
Para el código que necesita ser compatible con> 24 horas, esta solución TotalHourssigue siendo el camino a seguir incluso en las versiones más nuevas de .net.
CodesInChaos
1
De hecho, encuentro esto mejor ya que puedes confiar en él.
Chris Marisic
Tenga cuidado si usa TotalHours, ya que es un double, no un intigual Hours, es decir, mostrará fracciones de horas y horas completas.
Jinlye
6

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'

John Woo
fuente
11
Si usted va a utilizar la concatenación, que también podría utilizar el Hours, Minutes, Secondspropiedades de la OMI. Personalmente, prefiero usar una cadena de formato personalizado, después de averiguar las citas.
Jon Skeet
6

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;

Referencia para el análisis de intervalo de tiempo

zamoldar
fuente
5

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.

Jonas Stensved
fuente
2

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.

Giles
fuente