Подтвердить что ты не робот

Самый элегантный способ сочетания chrono:: time_point с часами, минутами, секундами и т.д.

У меня есть "читаемые человеком" переменные hours, minutes, seconds, day, month, 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 ) );

Во-первых, я потерял миллисекунды от SYSTEMTIME.
Во-вторых, (ммм...) мне не нравится такое преобразование))

Не могли бы вы дать более элегантный способ решить эту проблему?

4b9b3361

Ответ 1

Используя этот открытый источник, только библиотека только для заголовков, я могу:

#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

С помощью std-совместимого компилятора С++ 14 эти макросы должны быть установлены на:

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