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

Most elegant way to combine chrono::time_point from hours, minutes, seconds etc

本文关键字:point 小时 秒等 分钟 time 方式 组合 chrono      更新时间:2023-10-16

我有一个"人类可读的"变量hours, minutes, seconds, day, month, year,包含与其名称对应的值(假设我有<windows.h>SYSTEMTIME结构)。
我发现创建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 ) );

首先,我从SYSTEMTIME丢失了一个毫秒。
第二,(嗯…)我不喜欢这种转换)

你能给我一个更优雅的方式来处理这个问题吗?

使用这个开源的头文件库,我可以:

#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

在"date.h"中,您可能需要使用这些宏来使用VS进行编译:

#  define CONSTDATA const
#  define CONSTCD11 
#  define CONSTCD14
对于符合标准的c++ 14编译器,这些宏应该设置为:
#  define CONSTDATA constexpr
#  define CONSTCD11 constexpr 
#  define CONSTCD14 constexpr
相关文章: