Uso String.Format en un intervalo de tiempo de segundos completos sin salida milisegundos

StackOverflow https://stackoverflow.com/questions/3545508

  •  30-09-2019
  •  | 
  •  

Pregunta

Quiero mostrar el tiempo transcurrido entre dos fechas en una cadena.

Vamos a decir que tengo el siguiente código:

DateTime date1 = DateTime.Now();
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now();

TimeSpan elapsed = date2.substract(date1);
Console.WriteLine("> {0:hh:mm:ss}", elapsed);

Lo que espero:

> 00:00:03

Lo que me sale:

> 00:00:02.5002500

¿Hay una manera de utilizar la función String.Format a devolver sólo segundos completos?
También probé para eliminar los decimales con:

elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);

Pero eso no funciona bien desde elapsed.Miliseconds retornos 500 como un entero.

¿Fue útil?

Solución

Cambiar la

Console.WriteLine("> {0:hh:mm:ss}", elapsed);

a

Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed);

4 .Net le permite utilizar las cadenas de formato personalizado con Timespan. Se puede encontrar una referencia completa de los especificadores de formato disponibles en el formato de MSDN personalizada TimeSpan Cuerdas página.

Es necesario para escapar del ":". Personaje con un "\" (que a su vez debe ser escapado a menos que estés usando una cadena textual)

Este extracto del MSDN TimeSpan Formato Cuerdas explica acerca escapar de la ":" y "". caracteres en una cadena de formato:

  

Los personalizados TimeSpan especificadores de formato no incluyen marcadores de posición símbolos de separación, tales como los símbolos que días separados de hora, hora de minutos o segundos desde fracciones de segundo. En su lugar, estos símbolos deben ser incluidos en la cadena de formato personalizado como literales de cadena. Por ejemplo, "dd.hh: mm" define un período que el separador entre día y hora, y dos puntos (:) como separador entre las horas y minutos

(.).

Otros consejos

Por desgracia, no es posible dar formato a un TimeSpan de la misma manera como un valor DateTime. Sin embargo, puede hacer una conversión rápida debido a que tanto TimeSpan y DateTime almacenan su valor como garrapatas (en la propiedad Ticks).

En el código que se vería así:

Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));

ACTUALIZACIÓN: Esto se aplica a .NET 3.5 y anteriores, .NET 4 son compatibles con el formato lapsos

.

La clase TimeSpan tiene propiedades Hours, Minutes y Seconds que devuelven cada parte individual de tiempo. Lo que podría intentar:

String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}", 
    elapsed.Hours, 
    elapsed.Minutes, 
    elapsed.Seconds)

Para obtener el formato que desee.

Puede haber una manera más óptima, pero no he encontrado todavía.

Después de mirar algunas maneras de hacer esto, estoy por desgracia dejó con una respuesta feo. Realmente no se puede utilizar garrapatas, ya que no devuelve el formato correctamente, pero el siguiente trabajo:

DateTime date1 = DateTime.Now;
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now;

TimeSpan elapsed = date2.Subtract(date1);

string[] Split = elapsed.ToString().Split('.');

string m = Split[0]; // Returns 00:00:02

Hmm, esto es desagradable (como resulta) - al menos antes de .NET 4.0

Si vas aquí: http: / /msdn.microsoft.com/en-us/library/1ecy8h51(v=VS.90).aspx que le dirá que no hay sobrecarga de formato para un espacio de tiempo y que hay que hacerlo a mano por ejemplo, :

     span.Hours.ToString("00") + ":" + 
     span.Minutes.ToString("00") + ":" + 
     span.Seconds.ToString("00") + "."

Esto parece - al menos desde la documentación - a ser fijos en .NET 4.0

usted puede hacer esto:

dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString();

Hay siguientes especificadores de formato personalizado Y (años), M (mes), d (días), h (hora 12), H (hora 24), m (minuto), S (segundos), f (segunda fracción ), F (segunda fracción, ceros finales se recortan), t (PM o AM) y z (zona horaria).

Los siguientes ejemplos demuestran cómo son los especificadores de formato reescritas a la salida. [C #]

// create date time 2008-03-09 16:05:07.123    
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);    
String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year    
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month    
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day    
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute
String.Format("{0:s ss}",          dt);  // "7 07"            second    
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"   sec.fraction    
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"    without zeroes    
String.Format("{0:t tt}",          dt);  // "P PM"            A.M. or P.M.    
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"   time zone
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top