2009-07-30 26 views
33

Estoy buscando cómo formatear el tiempo, incluso microsegundos. Estoy usando la clase DateTime, que permite (usando propiedades) obtener datos hasta milisegundos, que no es enougth. Intenté usar Ticks, pero no sabía cómo traducirlo a microsegundos.C# tiempo en microsegundos

+4

tener cuidado con DateTime.Now, no es exacta al microsegundo. Pruebe System.Diagnostics.Stopwatch para tomar el tiempo. También asegúrese de tener un reloj de sistema de alta resolución. –

+0

Sí, tienes razón. Me tomó tiempo entender este comentario. Aunque presenta el tiempo en microsegundos, el tiempo no está en microsegundos. –

Respuesta

71

Puede utilizar "ffffff" en una cadena de formato para representar microsegundos:

Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.ffffff")); 

Para convertir un número de garrapatas a microsegundos, sólo tiene que utilizar:

long microseconds = ticks/(TimeSpan.TicksPerMillisecond/1000); 

Si estos no le ayudan, por favor brinde más información acerca de lo que está tratando de hacer exactamente.

EDIT: originalmente multiplica ticks por 1000 para evitar la pérdida de precisión cuando se divide por TimeSpan.TicksPerMillisecond 1000. Sin embargo, resulta que el TicksPerMillisecond es en realidad un valor constante de 10.000 - para que pueda dividir por 1000 sin ningún problema, y ​​en hecho que podríamos simplemente usar:

const long TicksPerMicrosecond = 10; 

... 

long microseconds = ticks/TicksPerMicrosecond; 
+0

Utilicé las dos opciones, el problema es que siempre obtengo los microsegundos cero. Parece que no puede obtener la resolución de eso. –

+2

Entonces eso no es un problema de formateo, es un problema de resolución. ¿De dónde estás obteniendo los datos para empezar? Si estás tratando de calcular cuánto tiempo lleva algo, debes utilizar la clase 'Cronómetro'. –

+0

No. Solo lo necesito para el registrador. Para cada evento en el sistema, ingresé al principio el momento en que sucedió. ¿Alguna sugerencia? –

6

"ffffff" es lo que necesita.

return DateTime.Now.ToString("HH:mm:ss.ffffff"); 
+0

Lo usé, el problema es que siempre imprime cero en los microsegundos, como que no lo calcula. –

+0

Esto no es un problema con el formateo, este es un problema con la precisión de DateTime.Now. Intenta usar System.Diagnostics.Stopwatch. –

+0

Lo probé con otra ventana (la mía es vista) y la resolución de los micrseconds –

18

No he podido obtener la conversión de Johns tick to micorosecond al trabajo. Así es como yo era capaz de medir microsegundo y la resolución de nanosegundos mediante el uso de las garrapatas y el cronómetro:

Stopwatch sw = new Stopwatch(); 
sw.Start(); 

// Do something you want to time 

sw.Stop(); 

long microseconds = sw.ElapsedTicks/(Stopwatch.Frequency/(1000L*1000L)); 
long nanoseconds = sw.ElapsedTicks/(Stopwatch.Frequency/(1000L*1000L*1000L)); 

Console.WriteLine("Operation completed in: " + microseconds + " (us)"); 
Console.WriteLine("Operation completed in: " + nanoseconds + " (ns)"); 
+0

sw.Elapsed.TotalMilliseconds es agradable. Luego divide por 1000 para obtener microsegundos. – rocketsarefast

+0

Esto no es del todo correcto, porque (Cronómetro.Frecuencia/(1000L * 1000L)) siendo un valor largo deja todo después de un decimal por ejemplo si el resultado de la ecuación en la línea de arriba (de mi comentario) es 2.8576 que es técnicamente 3 pero sw.ElapsedTicks se dividirá entre 2, no 2.8 o 3, lo cual es totalmente incorrecto. – user2913184

Cuestiones relacionadas