2014-10-23 13 views
10

Jaka byłaby najlepsza rzecz dla strptime, gdy mamy ciąg datetime z milisekundami?Jaki jest najlepszy sposób analizowania czasu milisekundy w C++ 11

Dane:

"30/03/09 16:31:32.121" 

nie możemy użyć zwykłej strptime ponieważ struct tm nie przechowuje millisseconds. Czy istnieje nowa klasa, która może to osiągnąć?

+0

['std :: get_time'] (http://en.cppreference.com/w/cpp/io/manip/get_time) to C++ 11, ale odzwierciedla specyfikację' strptime's. Czy chcesz zachować milisekundy, czy potrzebujesz go tylko wyświetlić? –

+0

Moim celem jest zapisanie tego czasu w chronometrażowym punkcie czasowym, więc potrzebuję go do przeanalizowania i zapisania. – Nezquick

+0

.1214 nie pytasz o milisekundy, ale przez 1/10 milisekund lub 100 mikrosekund. –

Odpowiedz

6

chciałbym analizować te pola ręcznie (odczyt na int i double dla sekund), a następnie użyć days_from_civil do konwersji rok/miesiąc/dzień w chrono::system_clock::time_point:

std::chrono::system_clock::time_point t(days(days_from_civil(y, m, d))); 

gdzie days jest:

using days = std::chrono::duration<int, std::ratio<86400>>; 

Następnie można dodać do tego godziny, minuty i sekundy. Aby poradzić sobie z ułamków sekund musisz zrobić lekki taniec:

double s; 
your_stream >> s; // 32.121 
using namespace std::chrono; 
duration<double> dsecs(s); 
seconds sec = duration_cast<seconds>(dsecs); 
milliseconds ms = duration_cast<milliseconds>(dsecs - sec); 
t += sec + ms; 

Jeśli wolisz, użyj round from here do konwersji milisekund:

milliseconds ms = round<milliseconds>(dsecs - sec); 

duration_cast jest obciąć do zera. Dostępne są inne tryby zaokrąglania: podłoga, okrąg, sufit, at this link.

Owiń wszystko w wygodną funkcję, aby łatwo je było ponownie wykorzystać. :-)

Powyższy kod zakłada UTC. Jeśli Twoja data/godzina, którą analizujesz, jest przesunięta względem czasu UTC, możesz dodać/odjąć to przesunięcie. Wszystkie znane implementacje system_clock ścieżki Unix time, czyli sekundy od 1970-01-01 w strefie czasowej UTC.

Aktualizacja

Od pisania tego odpowiedź ja stworzyliśmy more general library że PO wydawała się być poszukiwanie w tym czasie. To może przetwarzać wiele różnych pod drugim dokładności bezpośrednio do std::chrono::system_clock::time_point tak:

#include "date.h" 
#include <iostream> 
#include <sstream> 

int 
main() 
{ 
    std::istringstream in{"30/03/09 16:31:32.121\n" 
          "30/03/09 16:31:32.1214"}; 
    std::chrono::system_clock::time_point tp; 
    in >> date::parse("%d/%m/%y %T", tp); 
    using namespace date; 
    std::cout << tp << '\n'; 
    in >> date::parse(" %d/%m/%y %T", tp); 
    std::cout << tp << '\n'; 
} 

ten wyjścia:

2009-03-30 16:31:32.121000 
2009-03-30 16:31:32.121400 

Biblioteka używa tych samych technik i narzędzi, jak pierwotnie opisane, ale są pakowane gotowy do pracy jako biblioteka pojedynczego nagłówka.

+0

zamiast za pomocą days_from_civil (jeszcze innej biblioteki zewnętrznej) użyłem zwykłego time_t, aby część daty działała :) Skończyło się na tym, że używałem go: re2 do czytania wzorca, ponieważ chciałem coś nieco bardziej ogólnego. Dzięki – Nezquick

Powiązane problemy