From std::string to std::chrono::time_point there is no fill. You must create a std::chrono::time_point .
- Use everything but microseconds to create the
std::tm ( <ctime> ) <ctime> . The year should be based on 1900, and not 0. The month should be based on 0, not 1. - Use
std::mktime() to create the std::time_t object. - Create
std::chrono::time_point with from_time_t() . - Add the remaining decimal part (treated as an
int ) as the duration of std::chrono::microsecond() to your time_point .
Keep in mind that the functions <iomanip> std::ctime() and std::put_time() not aware of accuracy below a second. If you print this level of accuracy, you need to write a function for this.
#include <chrono> #include <ctime> #include <iomanip> #include <iostream> struct Tm : std::tm { int tm_usecs; // [0, 999999] micros after the sec Tm(const int year, const int month, const int mday, const int hour, const int min, const int sec, const int usecs, const int isDST = -1) : tm_usecs{usecs} { tm_year = year - 1900; // [0, 60] since 1900 tm_mon = month - 1; // [0, 11] since Jan tm_mday = mday; // [1, 31] tm_hour = hour; // [0, 23] since midnight tm_min = min; // [0, 59] after the hour tm_sec = sec; // [0, 60] after the min // allows for 1 positive leap second tm_isdst = isDST; // [-1...] -1 for unknown, 0 for not DST, // any positive value if DST. } template <typename Clock_t = std::chrono::high_resolution_clock, typename MicroSecond_t = std::chrono::microseconds> auto to_time_point() -> typename Clock_t::time_point { auto time_c = mktime(this); return Clock_t::from_time_t(time_c) + MicroSecond_t{tm_usecs}; } }; int main() { using namespace std::chrono; auto tp_nomicro = Tm(2014, 8, 19, 14, 31, 23, 0).to_time_point(); auto tp_micro = Tm(2014, 8, 19, 14, 31, 23, 946571).to_time_point(); std::cout << duration_cast<microseconds>(tp_micro - tp_nomicro).count() << " microseconds apart.\n"; auto time_c = high_resolution_clock::to_time_t(tp_micro); std::cout << std::ctime(&time_c) << '\n'; }
source share