如何在C ++中为std :: chrono :: steady_clock设置epoch?

时间:2016-01-12 19:29:29

标签: c++ datetime

我希望获得自特定时期以来毫秒级的当前时间,例如2016年1月1日。

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

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

1 个答案:

答案 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天内溢出。 : - )