我想获取自特定纪元以来的当前时间(以毫秒为单位),例如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/