2009-07-30 15 views
33

Je cherche comment formater le temps y compris les microsecondes. J'utilise la classe DateTime, elle permet (en utilisant les propriétés) d'obtenir des données jusqu'à milisecondes, ce qui n'est pas le cas. J'ai essayé d'utiliser Ticks, mais je ne savais pas comment le traduire en microsecondes.Temps C# en microsecondes

+4

Soyez prudent avec DateTime.Now, il est inexact de la microseconde. Essayez System.Diagnostics.Stopwatch pour saisir l'heure. Assurez-vous également d'avoir une horloge système haute résolution. –

+0

Oui, vous avez raison. Il m'a fallu du temps pour comprendre ce commentaire. Bien qu'il présente le temps en microsecondes, le temps n'est pas en microsecondes. –

Répondre

71

Vous pouvez utiliser "ffffff" dans une chaîne de format pour représenter microsecondes:

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

Pour convertir un certain nombre de tiques à microsecondes, il suffit d'utiliser:

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

Si ceux-ci ne vous aident pas, S'il vous plaît fournir plus d'informations sur exactement ce que vous essayez de faire.

EDIT: Je l'origine multiplié par ticks 1000 pour ne pas perdre la précision lors de la division par TimeSpan.TicksPerMillisecond 1000. Cependant, il se trouve que le TicksPerMillisecond est en fait une valeur constante de 10 000 - de sorte que vous pouvez diviser par 1000 sans problème, et fait nous pourrions simplement utiliser:

const long TicksPerMicrosecond = 10; 

... 

long microseconds = ticks/TicksPerMicrosecond; 
+0

J'ai utilisé les deux opyions le problème est que je reçois les microsecondes toujours zéro. Il semble qu'il ne peut pas obtenir la résolution de cela. –

+2

Ensuite, ce n'est pas un problème de formatage, c'est un problème de résolution. D'où obtenez-vous les données pour commencer? Si vous essayez de chronométrer la durée d'un événement, vous devez utiliser la classe 'Stopwatch'. –

+0

Non. J'en ai juste besoin pour l'enregistreur. Pour chaque événement dans le système, j'entre au début l'heure à laquelle cela s'est produit. Des suggestions? –

6

"ffffff" est ce qu'il vous faut.

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

Je l'ai utilisé le problème est qu'il imprime toujours zéro aux microsecondes, comme il ne le calcule pas. –

+0

Ce n'est pas un problème avec le formatage, c'est un problème avec la précision DateTime.Now. Essayez d'utiliser System.Diagnostics.Stopwatch. –

+0

Je l'ai essayé une autre fenêtre (la mienne est vista) et sa résolution f les micrsecondes –

18

Je n'ai pas réussi à faire coïncider Johns avec la conversion micoroseconde. Voici comment j'ai pu mesurer la microseconde et la résolution nanoseconde en utilisant les tiques et le Chronomètre:

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 est sympa. Puis diviser par 1000 pour obtenir des microsecondes. – rocketsarefast

+0

Ce n'est pas tout à fait exact, car (Stopwatch.Frequency/(1000L * 1000L)) étant une valeur longue laisse tout après une décimale par exemple si le résultat de l'équation dans la ligne ci-dessus (de mon commentaire) est 2.8576 ce qui est techniquement 3 mais sw.ElapsedTicks sera divisé par 2 et non 2,8 ou 3, ce qui est totalement faux. – user2913184