Как создать системную точку :: time_point из компонентов метки времени UTC (Y, M, D, ч, м, с, мс) - PullRequest
0 голосов
/ 17 января 2019

Я читаю некоторые данные из внешнего источника, который предоставляет мне метку времени UTC, разбитую на составляющие с точностью до миллисекунды, т.е. я получаю год, месяц, день, час, минуту, секунду и миллисекунду как целые числа. Как (эффективно) создать system_clock :: time_point, который представляет это время?

1 Ответ

0 голосов
/ 17 января 2019

Самым простым и эффективным способом является использование бесплатной библиотеки Говарда Хиннанта с открытым исходным кодом, только заголовок, один заголовок, дата / время :

#include "date/date.h"
...
using namespace date;
using namespace std::chrono;
int Y, M, D, h, m, s, ms;
...
system_clock::time_point tp = sys_days{year{Y}/M/D} + 
                              hours{h} + minutes{m} + seconds{s} + milliseconds{ms};

Все, что делает для вас библиотека даты / времени, - это конвертирование тройки Y / M / D в chrono::time_point<system_clock, days>. Тогда все остальное выражение - это C ++ 11 <chrono>.

библиотека даты / времени была включена в черновую спецификацию C ++ 20, поэтому, надеюсь, через несколько лет ваш код станет соответствовать стандарту, просто удалив #include "date/date.h" и using namespace date;.

Если по каким-либо причинам вы не можете использовать библиотеку даты / времени , тогда вы можете самостоятельно кодировать days_from_civil с помощью этой формулы общественного достояния.

...