2011-01-31 24 views
5

Estoy trabajando con .NET pero necesito comunicarme con un servicio de registro, basado en Unix, que espera segundos y microsegundos desde el tiempo de época de Unix. Los segundos es fácilmente recuperable haciendo algo como:¿Hay un equivalente de "gettimeofday" en .NET

DateTime UnixEpoch = new DateTime(1970, 1, 1); 
TimeSpan time = DateTime.UtcNow() - UnixEpoch 
int seconds = (int) time.TotalSeconds 

Sin embargo, estoy seguro de cómo calcular los microsegundos. Podría usar la propiedad TotalMilliseconds y convertirla a microsegundos, pero creo que eso frustra el propósito de usar microsegundos como medida precisa. He investigado el uso de la clase StopWatch, pero no parece que pueda sembrar con un tiempo (Unix Epoch, por ejemplo).

Gracias.

Respuesta

12

Utilice la propiedad Ticks para obtener el nivel más detallado de detalle. Una marca es 100ns, por lo que se divide entre 10 para llegar a microsegundos.

Sin embargo, que se refiere a la precisión representación - no habla acerca de la exactitud en absoluto. Dada la granularidad gruesa de DateTime.UtcNow, no espero que sea particularmente útil. Vea el blog post about the difference between precision and accuracy de Eric Lippert para más información.

Es posible que desee iniciar un cronómetro en un momento conocido, y básicamente agregar su vez al "punto de inicio". Tenga en cuenta que "ticks" de Stopwatch no significa lo mismo que TimeSpan.Ticks.

+0

Esta iba a ser mi respuesta, pero no sabía la resolución de un tic. Hacer esto. Excepto que, desde 100ns = .1us, ¿no deberías dividir las garrapatas entre 10 para obtener microsegundos? – KeithS

+0

Esta es la mejor respuesta, porque ofrece la mayor precisión disponible de 'UtcNow()', pero creo que la propiedad 'Ticks' realmente no es tan precisa. –

+0

@Keith: Whoops, yes, fixing :) –

4

De Epoch Converter:

epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000)/10000000; 

Este truncará a causa de la división entera, por lo que sea 10000000.0 para mantener la parte inferior a un segundo, o simplemente no hacer la división.

Es importante tener en cuenta que la propiedad .Ticks que se obtiene es en relación a 1-ene-0001 y no Jan 1, en la década de 1970 como UNIX, que es por qué es necesario restar ese desplazamiento arriba.

edit: para mayor claridad, esa desagradable constante es solo el número de tics entre el 1 de enero de 1 0001 y el 1 de enero de 1970 en UTC. Si toma la porción de segundos (62135596800) y divide por (365 * 24 * 60 * 60) verá que obtiene un número cercano a 1970, que por supuesto no es exactamente 1970 debido a ajustes de salto.

1

DateTime.Ticks representan unidades de 100 nanosegundos desde el 1 de enero de 0001.

0

En CPUs modernas con diferentes dinámicamente la velocidad del reloj, es muy difícil (o costoso) para obtener precisa la temporización del sub-milisegundo.

me gustaría sugerir que acaba de multiplicar la propiedad Milliseconds por 1000.

Uso Ticks como Jon sugiere, pero creo que su precisión es todavía va a estar en la vecindad de 1 ms.