给定一个时间点,如何获得自纪元以来的秒数?

eca*_*ain 2 c++ time c++11 c++-chrono

我有一个来自我正在使用的库中的函数,它需要一个 double 作为参数。它需要传递一个纳秒类型的偏移量加上 sytem_clock::now()。到目前为止我有这个代码:

system_clock::time_point now = std::chrono::system_clock::now(); 
    auto timepointoffset = (now + desiredOffset);
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑:所以我需要补充一点,问题是我需要在不存在丢失数据风险的情况下进行操作。我有这个代码:

    system_clock::time_point now = std::chrono::system_clock::now(); 
    auto timepointoffset =  std::chrono::time_point_cast<std::chrono::nanoseconds>(now + desiredOffset);
    double value = timepointoffset.time_since_epoch().count();
Run Code Online (Sandbox Code Playgroud)

问题是编译器说可能会丢失数据。

How*_*ant 5

这个程序:

#include <chrono>
#include <cmath>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    auto tp = system_clock::now() + 0ns;
    double t1 = tp.time_since_epoch().count();
    double t2 = std::nextafter(t1, INFINITY);
    std::cout << t2-t1 << '\n';
}
Run Code Online (Sandbox Code Playgroud)

目前输出:

256
Run Code Online (Sandbox Code Playgroud)

这意味着目前双精度不能准确表示自 1970-01-01 00:00:00 UTC 以来的纳秒数。double 可以表示等于 256ns(大约四分之一微秒)的单位。

自 2006-07-14 23:58:24.606847232 以来一直如此。在此之前(一段时间),double 可以表示精度为 128ns。

在 2043-01-25 23:56:49.213694464 UTC 时,double 将开始能够表示仅 512ns 的精度。

doublesystem_clock::time_point只能在 1969-09-18 18:00:01 到 1970-04-15 05:59:59 的近似范围内以纳秒精度存储 a 。

这种分析当然假设 IEEE 64 位双精度。