gpt4 book ai didi

c++ - 如何在 C++ 中为 std::chrono::steady_clock 设置纪元?

转载 作者:太空狗 更新时间:2023-10-29 21:38:37 24 4
gpt4 key购买 nike

我想获取自特定纪元以来的当前时间(以毫秒为单位),例如2016 年 1 月 1 日。

这样做的原因是为了避免 std::chrono::milliseconds 使用 8 个字节。
我想将结果存储在 4 字节数据类型中。

std::chrono::steady_clock() 使用未指定的默认纪元。

最佳答案

以下是您可以按照 David 的评论中的建议创建自己的时钟的方法.

#include "date.h"
#include <cstdint>
#include <iostream>

struct myclock
{
using rep = std::int32_t;
using period = std::milli;
using duration = std::chrono::duration<rep, period>;
using time_point = std::chrono::time_point<myclock>;
static constexpr bool is_steady = false;

static time_point now() noexcept
{
using namespace std::chrono;
using namespace date;
return time_point{duration_cast<duration>(system_clock::now()
- sys_days{jan/1/2016})};
}
};

static_assert(sizeof(myclock::time_point) == 4, "");
static_assert(sizeof(myclock::duration) == 4, "");

int
main()
{
auto tp = myclock::now();
std::cout << tp.time_since_epoch().count() << '\n';
}

如您指定的那样,表示形式指定为int32_t,精度为毫秒,如您指定的那样。

为了获得您指定的纪元,我得到了 this date library 的帮助这使得日期和 system_clock::time_point 的互操作变得非常容易。我只是从 system_clock::now() 中减去您想要的纪元,并将该持续时间转换为 myclock::duration(32 位毫秒)。

运行这个程序刚才输出给我:

1207186990

也就是 13.97 天。

您可以使用以下代码计算时钟的范围:

using namespace date;
using namespace std::chrono;
auto min = milliseconds{myclock::duration::min()} + sys_days{jan/1/2016};
auto max = milliseconds{myclock::duration::max()} + sys_days{jan/1/2016};
std::cout << min << '\n';
std::cout << max << '\n';

显式转换为 std::chrono::milliseconds 是避免溢出所必需的。这将输出:

2015-12-07 03:28:36.352
2016-01-25 20:31:23.647

所以最好快点。 myclock 将在另外 10 天后溢出。 :-)

关于c++ - 如何在 C++ 中为 std::chrono::steady_clock 设置纪元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34752220/

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