日历时间,纳秒分辨率为纳秒纪元



我正在使用一个属性c++11库,该库有自己的实现Datetime它们的实现可以简化为包含长达纳秒的时间部分的结构。一个粗略的例子将如下所示:

    struct custom_time_t {
       unsigned year;
       unsigned month;
       unsigned day;
       unsigned hour;
       .......
       long long nanoseconds;
    }

我想从这个自定义对象中获取epoch,但也要以纳秒分辨率获取 - 类似于gettimeofday.

通常使用 std::chronostd::tm 将纪元增加到秒,但如何获得自 epoch 年以来的纳秒?

最简单的方法是使用 C++20 <chrono>库的预览。

#include "date/date.h"
#include <chrono>
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>
to_time_point(custom_time_t const& t)
{
    using namespace date;
    using namespace std::chrono;
    return sys_days{year(t.year)/t.month/t.day} + hours(t.hour) + ...
             + nanoseconds{t.nanoseconds};
}

返回类型具有基于 system_clocktime_point的正确值。 如果使用 .time_since_epoch().count() 从中提取值,您将获得自 1970-01-01 00:00:00.000000000 UTC 以来(或之前(的nanoseconds数。

在 C++14 中也可以使用 auto 作为返回类型,但我想弄清楚返回类型是什么。 此返回类型还有一个类型别名:sys_time<nanoseconds>

我会坚持std::chrono并将持续时间转换为std::chrono::nanoseconds

#include <iostream>
#include <chrono>
int main() {
    const auto p0 = std::chrono::time_point<std::chrono::system_clock>{};
    const auto end = std::chrono::system_clock::now();
    const auto diff = end - p0;
    const auto diff_ns = std::chrono::duration_cast< std::chrono::nanoseconds >( diff );
    const auto diff_h = std::chrono::duration_cast< std::chrono::hours >( diff );
    std::cout  << diff_h.count() << "h "  << diff.count() << " s " << diff_ns.count() << "nsn";
}

附言。我真的看不出存储年、月、...靠你自己。

最新更新