gpt4 book ai didi

C++ 自定义时间日期结构到 utc 纪元

转载 作者:行者123 更新时间:2023-11-30 05:06:31 26 4
gpt4 key购买 nike

我使用一个库,该库使用以下结构来定义开始时间戳,如下所示。

    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的客户可以以他们想要的任何方式显式截断精度( floorroundceil 等)。未能截断精度(如果需要)不会是无提示的运行时错误。

客户端代码(在 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

这会转换一个 SYSTEMTIMEstd::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 = weekday{sd}.c_encoding();
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;
}

关于C++ 自定义时间日期结构到 utc 纪元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com