我使用的库使用以下结构来定义启动时间戳,如下所示。
struct SYSTEMTIME {
/** year */
WORD year;
/** month */
WORD month;
/** day of week */
WORD dayOfWeek;
/** day */
WORD day;
/** hour */
WORD hour;
/** minute */
WORD minute;
/** second */
WORD second;
/** milliseconds */
WORD milliseconds;
};
对于此时间之后的每个日志条目,以与该第一个时间戳的纳秒差为单位进行指定。
可以说其UTC 2017-12-19 14:44:00
之后的第一个日志条目为397000ns。
如何从第一个SYSTEMTIME结构的纪元开始创建chronos,time_t或unix时间,然后向其添加纳秒。
打印输出应该是第一次输入
2017-12-19 14:44:00.000397
最好的祝福
最佳答案
更新了
我对下面的代码做了一些修改,以便在SYSTEMTIME
和date::sys_time<std::chrono::milliseconds>
之间进行转换,而不是date::sys_time<std::chrono::nanoseconds>
。
原理:因此to_SYSTEMTIME
中没有隐式精度损失。 to_SYSTEMTIME
的客户端可以按照他们想要的任何方式(floor
,round
,ceil
等)显式地截断精度。未能截断精度(如果需要)将不会是无提示的运行时错误。
客户端代码(在main
中)不受此更改的影响。
您可以为此使用Howard Hinnant's free, open-source, header-only date/time library:
#include "date/date.h"
#include <iostream>
using WORD = int;
struct SYSTEMTIME {
/** year */
WORD year;
/** month */
WORD month;
/** day of week */
WORD dayOfWeek;
/** day */
WORD day;
/** hour */
WORD hour;
/** minute */
WORD minute;
/** second */
WORD second;
/** milliseconds */
WORD milliseconds;
};
date::sys_time<std::chrono::milliseconds>
to_sys_time(SYSTEMTIME const& t)
{
using namespace std::chrono;
using namespace date;
return sys_days{year{t.year}/t.month/t.day} + hours{t.hour} +
minutes{t.minute} + seconds{t.second} + milliseconds{t.milliseconds};
}
int
main()
{
using namespace std::chrono;
using namespace date;
SYSTEMTIME st{2017, 12, 2, 19, 14, 44, 0, 0};
auto t = to_sys_time(st) + 397000ns;
std::cout << floor<microseconds>(t) << '\n';
}
输出:
2017-12-19 14:44:00.000397
通过从
SYSTEMTIME
中收集不同的部分,这会将std::chrono::time_point<system_clock, milliseconds>
转换为date::sys_time<milliseconds>
(其类型别名为SYSTEMTIME
)。然后,它仅将nanoseconds
添加到该time_point
中,将其截断为microseconds
所需的精度,然后将其输出。如果有帮助,可以使用以下方法使用相同的库进行相反的转换:
SYSTEMTIME
to_SYSTEMTIME(date::sys_time<std::chrono::milliseconds> const& t)
{
using namespace std::chrono;
using namespace date;
auto sd = floor<days>(t);
year_month_day ymd = sd;
auto tod = make_time(t - sd);
SYSTEMTIME x;
x.year = int{ymd.year()};
x.month = unsigned{ymd.month()};
x.dayOfWeek = unsigned{weekday{sd}};
x.day = unsigned{ymd.day()};
x.hour = tod.hours().count();
x.minute = tod.minutes().count();
x.second = tod.seconds().count();
x.milliseconds = tod.subseconds().count();
return x;
}