Jak dokładnie skonstruować znacznik czasu rzeczywistego z dokładnością do milisekund?
Potrzebuję czegoś takiego jak 16.4.2013 9: 48: 00: 123. czy to możliwe? Mam aplikację, w której próbkuję wartości 10 razy na sekundę i muszę pokazać je na wykresie.
c#
datetime
precision
milliseconds
LuckyHK
źródło
źródło
hh
godzin (czas standardowy). W przypadku znacznika czasu (i w wielu innych przypadkach) należy go prawdopodobnie powiązać ztt
(am / pm) lub zastąpić przezHH
(czas wojskowy).Odpowiedzi:
Podejrzewam, że masz na myśli milisekundową dokładność .
DateTime
ma dużą precyzję, ale jest dość gruboziarnisty pod względem dokładności. Ogólnie rzecz biorąc, nie możesz. Zwykle zegar systemowy (z któregoDateTime.Now
pobiera dane) ma rozdzielczość około 10-15 ms. Więcej informacji można znaleźć w blogu Erica Lipperta na temat precyzji i dokładności .Jeśli potrzebujesz dokładniejszego pomiaru czasu, możesz rozważyć użycie klienta NTP.
Nie jest jednak jasne, czy naprawdę potrzebujesz tutaj milisekundowej dokładności. Jeśli nie zależy ci na dokładnym czasie - chcesz tylko pokazać próbki we właściwej kolejności, z „całkiem dobrą” dokładnością, to zegar systemowy powinien być w porządku. Radzę
DateTime.UtcNow
raczej użyć zamiastDateTime.Now
tego, aby uniknąć problemów ze strefą czasową wokół przejść w czasie letnim itp.Jeśli pytanie jest rzeczywiście tuż konwertowania
DateTime
na sznurku z dokładnością do milisekund, sugeruję, używając:(Należy pamiętać, że w przeciwieństwie do próbki, jest to możliwe do sortowania i mniej prawdopodobne jest, że spowoduje zamieszanie wokół tego, czy ma to być „miesiąc / dzień / rok” czy „dzień / miesiąc / rok”).
źródło
DateTime.UtcNow
wielokrotnie, czy to zawsze zwiększa się tylko raz na sekundę? Nie pokazałeś tego.)To powinno działać:
Jeśli nie potrzebujesz go wyświetlać i potrzebujesz tylko znać różnicę czasu, nie przekształcaj go w ciąg znaków. Po prostu zostaw to jako
DateTime.Now();
I użyj,
TimeSpan
aby poznać różnicę między przedziałami czasowymi:Przykład
źródło
Szukałem podobnego rozwiązania, na podstawie tego, co zostało zasugerowane w tym wątku, używam następujących
DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff")
i działa jak urok. Uwaga:.fff
są to liczby precyzyjne, które chcesz uchwycić.źródło
HH
(czas wojskowy) lub dodajtt
(PM lub AM). Jak pokazano w tym przykładzie: repl.it/KGr3/1Użyj struktury DateTime z milisekundami i sformatuj ją w następujący sposób:
źródło
Odpowiedź Pyromancer wydaje mi się całkiem dobra, ale może chciałeś:
Ale jeśli porównujesz daty, możesz wybrać TimeSpan.
źródło
TotalMilliseconds
. Milliseconds przechowuje bieżący licznik Milliseconds, który nigdy nie jest większy niż 1000, podczas gdy TotalMilliseconds przechowuje całkowite milisekundy, które upłynęły od epoki.Jeśli nadal chcesz datę zamiast ciągu, podobnie jak inne odpowiedzi, po prostu dodaj tę metodę rozszerzenia.
źródło
O ile rozumiem pytanie, możesz wybrać:
To odetnie kleszcze mniejsze niż 1 milisekunda.
źródło
Kłopot ze
DateTime.UtcNow
iDateTime.Now
to, że w zależności od komputera i systemu operacyjnego, może być tylko z dokładnością od 10 do 15 milisekund. Jednak na komputerach z systemem Windows można użyć funkcji niskiego poziomu GetSystemTimePreciseAsFileTime, aby uzyskać dokładność mikrosekundową, patrz funkcjaGetTimeStamp()
poniżej.źródło
spróbuj użyć datetime.now.ticks. zapewnia to precyzję nanosekundową. biorąc deltę dwóch tików (stoptick - starttick) / 10 000 to milisekunda określonego interwału.
https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.7.2
źródło
Jeśli chcesz mikrosekund, po prostu zmień
10000
na10
, a jeśli chcesz dziesiątą mikro, usuń/ 10000
.źródło
DateTime.Now.ToString („ddMMyyyyhhmmssffff”)
źródło