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.
['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ć? –
Moim celem jest zapisanie tego czasu w chronometrażowym punkcie czasowym, więc potrzebuję go do przeanalizowania i zapisania. – Nezquick
.1214 nie pytasz o milisekundy, ale przez 1/10 milisekund lub 100 mikrosekund. –