我希望获得自特定时期以来毫秒级的当前时间,例如2016年1月1日。
这样做的原因是为了避免对std :: chrono :: milliseconds使用8个字节 我想将结果存储在4byte数据类型中。
std :: chrono :: steady_clock()使用未指定的默认纪元。
答案 0 :(得分:2)
以下是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天内溢出。 : - )