2009-07-30 13 views
33

Szukam sposobu formatowania czasu, w tym mikrosekund. Używam klasy DateTime, która pozwala (używając właściwości), aby uzyskać dane do milisekund, co nie jest wystarczające. Próbowałem używać kleszczy, ale nie wiedziałem, jak to przetłumaczyć na mikrosekundy.C# czas w mikrosekundach

+4

być ostrożnym z DateTime.Now, że nie jest z dokładnością do mikrosekund. Wypróbuj System.Diagnostics.Stopwatch, aby pobrać czas. Upewnij się też, że masz zegar systemowy o wysokiej rozdzielczości. –

+0

Tak, masz rację. Zajęło mi trochę czasu, aby zrozumieć ten komentarz. Chociaż przedstawia czas w mikroscedzie, czas nie jest w mikrosekundach. –

Odpowiedz

71

Można użyć "ffffff" w ciągu formatu do reprezentowania mikrosekund:

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

Aby przekonwertować liczbę kleszczy do mikrosekund, wystarczy użyć:

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

Jeśli to nie pomoże, proszę podać więcej informacji o tym, co dokładnie próbujesz zrobić.

EDIT: I początkowo pomnożona ticks przez 1000, aby uniknąć utraty dokładności przy podziale TimeSpan.TicksPerMillisecond przez 1000. Tymczasem okazuje się, że TicksPerMillisecond jest rzeczywiście stała wartość 10000 - tak można podzielić przez 1000 bez problemu, aw Fakt, że możemy po prostu użyć:

const long TicksPerMicrosecond = 10; 

... 

long microseconds = ticks/TicksPerMicrosecond; 
+0

Użyłem obu opcji, problem polega na tym, że otrzymuję mikrosekundy zawsze zerowe. Wygląda na to, że nie uda się tego rozwiązać. –

+2

To nie jest problem z formatowaniem, to problem z rozdzielczością. Skąd czerpiesz dane od początku? Jeśli próbujesz oszacować czas potrzebny na coś, powinieneś użyć klasy 'Stopwatch'. –

+0

Nie. Potrzebuję go tylko do rejestratora. Dla każdego zdarzenia w systemie wpisuję na początku czas, w którym to się stało. Jakieś suggetsions? –

6

"ffffff" jest tym, czego potrzebujesz.

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

Ja użyłem tego problemu, ponieważ zawsze drukuje zero w mikrosekundach, tak jak go nie oblicza. –

+0

To nie jest problem z formatowaniem, to jest problem z DateTime.Now dokładność. Spróbuj użyć System.Diagnostics.Stopwatch. –

+0

Wypróbowałem to inne okno (moje jest widok perspektywiczny) i jego rozdzielczość f mikrosekundy –

18

Nie udało mi się przekonać Johnsa do mikroprocesorowej konwersji do pracy. Oto w jaki sposób udało mi się zmierzyć mikrosekundy nanosekundy i rozdzielczości za pomocą kleszczy i stoper:

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 jest ładne. Następnie podziel przez 1000, aby uzyskać mikrosekundy. – rocketsarefast

+0

To nie jest w porządku, ponieważ (Stopwatch.Frequency/(1000L * 1000L)) jest długością pozostawia wszystko po przecinku, na przykład, jeśli wynik równania w powyższej linii (mojego komentarza) wynosi 2,8576, co jest technicznie 3, ale sw.ElapsedTicks zostaną podzielone przez 2, a nie 2.8 lub 3, co jest całkowicie błędne. – user2913184