最优雅的方式结合chrono :: time_point,从小时,分钟,秒等

时间:2015-07-08 06:25:14

标签: c++ c++11 chrono

我有一个“人类可读”变量hoursminutessecondsdaymonth,{{ 1}}包含与其名称相对应的值(假设我year的结构为SYSTEMTIME)。
我发现创建<windows.h>的唯一方法是:

chrono::time_point

首先,我从SYSTEMTIME sysTime = ...; // Came from some source (file, network, etc. ) tm t; t.tm_sec = sysTime.wSecond; t.tm_min = sysTime.wMinute; t.tm_hour = sysTime.wHour; t.tm_mday = sysTime.wDay; t.tm_mon = sysTime.wMonth - 1; t.tm_year = sysTime.wYear - 1900; t.tm_isdst = 0; std::chrono::system_clock::time_point dateTime = std::chrono::system_clock::from_time_t( mktime( & t ) ); 丢失了一毫秒 第二,(mmm ......)我不喜欢这种转换))

你能以更优雅的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

使用this open source, header-only library,我可以:

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

struct SYSTEMTIME
{
    int wMilliseconds;
    int wSecond;
    int wMinute;
    int wHour;
    int wDay;
    int wMonth;
    int wYear;
};

int
main()
{
    SYSTEMTIME sysTime = {123, 38, 9, 10, 8, 7, 2015};
    std::chrono::system_clock::time_point dateTime =
        date::sys_days(date::year(sysTime.wYear)
                      /date::month(sysTime.wMonth)
                      /date::day(sysTime.wDay))
        + std::chrono::hours(sysTime.wHour)
        + std::chrono::minutes(sysTime.wMinute)
        + std::chrono::seconds(sysTime.wSecond)
        + std::chrono::milliseconds(sysTime.wMilliseconds);
    std::cout << dateTime << '\n';
}

输出:

2015-07-08 10:09:38.123000

在&#34; date.h&#34;中,您可能需要使用这些宏来编译VS.:

#  define CONSTDATA const
#  define CONSTCD11 
#  define CONSTCD14

使用符合标准的C ++ 14编译器,这些宏应设置为:

#  define CONSTDATA constexpr
#  define CONSTCD11 constexpr 
#  define CONSTCD14 constexpr