How to convert std::chrono::time_point to calendar datetime string with fractional seconds?

后端 未结 7 2065
生来不讨喜
生来不讨喜 2020-11-27 02:50

How to convert std::chrono::time_point to calendar datetime string with fractional seconds?

For example:

\"10-10-2012 12:38:40.123456\"         


        
7条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-11-27 03:30

    This worked for me for a format like YYYY.MM.DD-HH.MM.SS.fff. Attempting to make this code capable of accepting any string format will be like reinventing the wheel (i.e. there are functions for all this in Boost.

    std::chrono::system_clock::time_point string_to_time_point(const std::string &str)
    {
        using namespace std;
        using namespace std::chrono;
    
        int yyyy, mm, dd, HH, MM, SS, fff;
    
        char scanf_format[] = "%4d.%2d.%2d-%2d.%2d.%2d.%3d";
    
        sscanf(str.c_str(), scanf_format, &yyyy, &mm, &dd, &HH, &MM, &SS, &fff);
    
        tm ttm = tm();
        ttm.tm_year = yyyy - 1900; // Year since 1900
        ttm.tm_mon = mm - 1; // Month since January 
        ttm.tm_mday = dd; // Day of the month [1-31]
        ttm.tm_hour = HH; // Hour of the day [00-23]
        ttm.tm_min = MM;
        ttm.tm_sec = SS;
    
        time_t ttime_t = mktime(&ttm);
    
        system_clock::time_point time_point_result = std::chrono::system_clock::from_time_t(ttime_t);
    
        time_point_result += std::chrono::milliseconds(fff);
        return time_point_result;
    }
    
    std::string time_point_to_string(std::chrono::system_clock::time_point &tp)
    {
        using namespace std;
        using namespace std::chrono;
    
        auto ttime_t = system_clock::to_time_t(tp);
        auto tp_sec = system_clock::from_time_t(ttime_t);
        milliseconds ms = duration_cast(tp - tp_sec);
    
        std::tm * ttm = localtime(&ttime_t);
    
        char date_time_format[] = "%Y.%m.%d-%H.%M.%S";
    
        char time_str[] = "yyyy.mm.dd.HH-MM.SS.fff";
    
        strftime(time_str, strlen(time_str), date_time_format, ttm);
    
        string result(time_str);
        result.append(".");
        result.append(to_string(ms.count()));
    
        return result;
    }
    

提交回复
热议问题