Czasami widzę timespec
i timeval
jako czasy trwania, a czasami widzę je jako punkty czasowe. Będziesz musiał wiedzieć, jakie wartości trzymasz. W <chrono>
te dwa pojęcia są różnymi typami.
Czas to ilość czasu: coś, co można zmierzyć za pomocą stopera. Przykładowe czasy trwania to 2 minuty, 3 sekundy, 4 godziny i 16 lat.
Punkt czasowy to konkretny czas: 14.00 14 lipca 2015 r. Lub 6 godzin od momentu uruchomienia komputera. Punkt czasowy ma przypisaną epokę z nim związaną. Epoka to tylko wspólnie uzgodnione pochodzenie, od którego mierzy się czas.
Jeśli timespec
posiada czas trwania:
timespec ts = {3, 123}; // 3 seconds + 123 nanoseconds
auto d = std::chrono::seconds{ts.seconds}
+ std::chrono::nanoseconds{ts.nanoseconds};
timespec
Jeśli urządzenie posiada punkt w czasie, trzeba poznać epokę. Jest prawdopodobne, że epoką jest 1970-01-01 00:00:00 UTC, zaniedbując sekundy przestępne (to jest Unix time). Jeśli tak, możesz umieścić go w std::chrono::system_clock::time_point
. Ten typ jest nie gwarancją mają tę epokę, ale każdy robi realizacja:
using namespace std::chrono;
system_clock::time_point tp{duration_cast<system_clock::duration>(d)};
gdzie d
obliczany jest jak wyżej.
Jeśli masz numer timeval
, użyj microseconds
gdzie użyłem nanoseconds
.
Nie można przenośnie używać wartości czasowych high_resolution_clock
lub steady_clock
, ponieważ różne implementacje mają różne epoki dla tych typów.
Także jeśli używasz timeval
, w praktyce staje się zbędne duration_cast
jak czas trwania d
będzie niejawnie przekonwertować do wszystkich implementacjach system_clock::duration
:
using namespace std::chrono;
system_clock::time_point tp{d};
Jeżeli nie jesteś pewien, czy potrzebne są duration_cast
lub nie, spróbuj bez. Jeśli się kompiluje, nie potrzebujesz tego. Jeśli otrzymasz błąd podczas kompilacji, potrzebujesz go. Jest potrzebny podczas konwersji czasów trwania i nie ma dokładnej konwersji.
'std :: chrono :: system_clock' ma dogodne metody' from_time_t' i 'to_time_t'. Powinny one zapewnić bardziej przenośną konwersję, jeśli mówimy o 'punktach czasowych'. – user666412
@ user666412: Tak. Wstawiłem 'from_time_t' i' to_time_t' do C++ 11.:-) Niestety 'time_t' jest zwykle zarówno całkowite, jak i reprezentuje sekundy, podczas gdy oba' timespec' i 'timeval' reprezentują jednostki lepsze niż sekundę. Przechodzenie przez 'do/od_czasu_t" oznacza, że musisz skrócić precyzję do sekund, a następnie odzyskać tę dokładność. Pomiędzy tobą a mną, korzyścią 'to/from_time_t' jest to, że zachęcił on implementatorów do używania standardu UnixTime dla' system_clock'. :-) –
Interesujący fakt. Dziękuję za podzielenie się. Po prostu myślałem o 'to/from_time_t' jako przenośnym sposobie dostosowywania epoki, ponieważ może to być specyficzna implementacja, a ułamki sekund mogą być dodawane w taki sam sposób, jak w przypadku czasu trwania. – user666412