2011-01-31 17 views
5

Sto lavorando con .NET ma ho bisogno di comunicare con un servizio di registrazione, basato su unix, che si aspetta secondi e microsecondi dal momento dell'epoca Unix. I secondi sono facilmente recuperabili fare qualcosa di simile:Esiste un equivalente di "gettimeofday" in .NET

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

tuttavia, non sono sicuro come calcolare i microsecondi. Potrei usare la proprietà TotalMilliseconds e convertirla in microsecondi ma credo che sconfigge lo scopo di usare i microsecondi come misura precisa. Ho esaminato l'uso della classe StopWatch ma non mi sembra di poterla seminare (UNIX Epoch per esempio).

Grazie.

risposta

12

Utilizzare la proprietà Ticks per ottenere il livello di dettaglio più dettagliato. Un tick è 100ns, quindi dividere per 10 per arrivare a microsecondi.

tuttavia, che parla della precisione rappresentazione - non parlare del accuratezza a tutti. Data la granularità grossolana di DateTime.UtcNow, non mi aspetto che sia particolarmente utile. Vedere Eric Lippert blog post about the difference between precision and accuracy per ulteriori informazioni.

Si consiglia di avviare un cronometro in un momento noto, e in pratica aggiungere il suo tempo al "punto di partenza". Tieni presente che i "segni di graduazione" da Stopwatch non corrispondono a TimeSpan.Ticks.

+0

Questa sarebbe stata la mia risposta, ma non conoscevo la risoluzione di una zecca. Fai questo. Tranne, dal momento che 100ns = .1us, non dovresti dividere le zecche per 10 per ottenere microsecondi? – KeithS

+0

Questa è la risposta migliore, perché offre la massima precisione disponibile da 'UtcNow()', ma penso che la proprietà 'Ticks' non sia poi così precisa. –

+0

@Keith: Whoops, sì, fissando :) –

4

Da Epoch Converter:

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

Questo tronca a causa di divisione intera, quindi renderlo 10000000.0 per mantenere la porzione inferiore al secondo, o semplicemente non fare la divisione.

E 'importante notare che il .Ticks immobile che si ottiene è relativo al 1 gennaio 0001 e non 1 gennaio 1970 come in UNIX, che è il motivo per cui è necessario sottrarre che compensare sopra.

: solo per chiarezza, quella cattiva costante è solo il numero di zecche tra il 1 ° gennaio 0001 e il 1 ° gennaio 1970 in UTC. Se si prende la parte dei secondi (62135596800) e si divide per (365 * 24 * 60 * 60) si vede che si ottiene un numero vicino a 1970, che naturalmente non è esattamente il 1970 a causa di aggiustamenti saltellanti.

1

DateTime.Ticks rappresentare unità di 100 nanosecondi dal 1 gennaio 0001.

0

Sulla CPU moderne con vari dinamicamente frequenza di clock, è molto difficile (o costoso) per ottenere precise tempistiche sub-millisecondo.

Io suggerirei che basta moltiplicare la proprietà Milliseconds per 1000.

Usa Ticks come suggerisce Jon, ma penso che la precisione è ancora in corso di essere nel quartiere di 1ms.