纳秒分辨率到纳秒纪元的日历时间

Posted

技术标签:

【中文标题】纳秒分辨率到纳秒纪元的日历时间【英文标题】:Calendar time with nanoseconds resolution to nanoseconds epoch 【发布时间】:2019-11-25 21:14:21 【问题描述】:

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

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

我想从这个自定义对象中获取epoch,但也需要纳秒级的分辨率——类似于gettimeofday

使用std::chronostd::tm 将纪元提高到秒是典型的,但是如何从epoch 获得纳秒呢?

【问题讨论】:

【参考方案1】:

最简单的方法是使用这个preview of the C++20 <chrono> library。

#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_daysyear(t.year)/t.month/t.day + hours(t.hour) + ...
             + nanosecondst.nanoseconds;

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

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

【讨论】:

【参考方案2】:

我会坚持使用std::chrono 并将duration 转换为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() << "ns\n";

附言。我真的不明白自己存储年、月……的值有什么意义。

【讨论】:

这并没有真正将分辨率更改为纳秒。它仍然是系统时钟的分辨率,但末尾有一些额外的零。 我认为这无关紧要,因为我对当前时间点 std::chrono::system_clock::now() 不感兴趣,但在任何时候,如果我能找到一种方法在纳秒内构造 std::time_point给定结构的级别 - 不属于我 - 我的问题将得到解决。 @user6556709 你可以使用std::chrono::high_resolution_clock @eyadof 我认为这回答了你的问题。 ***.com/questions/52238978/… @schorsch312 high_resolution_clock:now() 不是来自时代。例如,在 Linux 上,它是从上次启动开始的。

以上是关于纳秒分辨率到纳秒纪元的日历时间的主要内容,如果未能解决你的问题,请参考以下文章

纪元纳秒到正常时间

是否有可用于 CLR 的高分辨率(微秒、纳秒)DateTime 对象?

处理纳秒时间戳字符串

log15 库将纪元时间从纳秒到秒进行记录

提升::posix_time。如何在同一应用程序中同时表示微秒和纳秒日期时间

如何将纳秒的纪元时间转换为人类可读的?