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

标签 c++ datetime

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

相关文章:

c++ - Opencv - filter2D() 方法实际上是如何工作的?

javascript - 在 JavaScript 中将 RFC 1123 日期格式转换为正常日期时间

javascript - JS Date seconds 在 c# 中给出不同的日期

C++ 类型 unsigned long int

c++ - 如何在 64 位 Windows 中制作 OpenGL 应用程序?

c++ - 数组比 vector 有什么优势?

c# - 将天数添加到 DateTime 返回值为 0?

javascript - new Date() 适用于 Chrome 但不适用于 Firefox

ruby-on-rails - 如何在 Ruby 中更改 DateTime 的时区?

c++ - ThreadSanitizer 报告的数据竞争