c++ - 有没有一种标准方法可以在不使用 Boost 的情况下将 std::string 转换为 std::chrono::time_point?

标签 c++ time c++-chrono

基本上,我正在寻找一种标准方法将 2014/08/29-11:42:05.042 之类的字符串转换为 time_point 对象。我知道如何用 boost 来做,但是只能用 STL 库来做吗?怎么办?

如果能指定像 %y/%m/%d-%H:%M:%S.%f 或类似的格式,那就太好了。

最佳答案

好的,至少对于具有毫秒分辨率的固定格式,这是可行的。试图让这段代码能够接受任何字符串格式就像重新发明轮子一样(即 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<milliseconds>(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;
}

为了测试它,我这样尝试并确保字符串正确表示当前日期时间:

auto tp_src = system_clock::now();
string value = time_point_to_string(tp_src);
auto tp_cnv = string_to_time_point(value);
auto error = duration_cast<milliseconds>(tp_src - tp_cnv).count();
Assert::IsTrue(error == 0);

关于c++ - 有没有一种标准方法可以在不使用 Boost 的情况下将 std::string 转换为 std::chrono::time_point?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560528/

相关文章:

c++ - 如何去除图像中的黑色部分?

java - 如何将 RFC-1123 日期时间格式化程序转换为本地时间

c++ - 如何在 C++11 中以毫秒为单位打印当前系统时间?

C++ 对默认构造函数的 undefined reference

c++ - 从 DLL 访问 Windows CE .EXE 符号

c++ - 如何打印 C++11 时间点?

go - 在 Go 中正确测量持续时间

c++ - 如何将 std::chrono::time_point 转换为 uint64_t?

c++ - 将 time_point 降低到给定持续时间的推荐方法

c++ - 如何引用连续的组件(button1、button2 等)?