C++ std::chrono时钟之间的铸造时间点

C++ std::chrono时钟之间的铸造时间点,c++,linux,c++11,C++,Linux,C++11,这篇文章的标题行实际上只是我问题的一半(简单的一半)。所以,我将退后一步,谈谈我正在尝试做的事情 使用std::chrono测量经过的时间非常容易。然而,到目前为止,我还没有看到任何“计时器”的实现能达到秒表圈数的效果。也就是说,当您想要开始跟踪时间间隔时,可以调用Timer.start(),每次想要记录时间间隔时,都可以调用Timer.tick()。然后,在快速的事情结束后,你可以回顾记录的时间间隔列表;也许可以解释平均值和1%的高点之类的 另外,因为我经常使用它,我想任意询问计时器从午夜到现

这篇文章的标题行实际上只是我问题的一半(简单的一半)。所以,我将退后一步,谈谈我正在尝试做的事情

使用
std::chrono
测量经过的时间非常容易。然而,到目前为止,我还没有看到任何“计时器”的实现能达到秒表圈数的效果。也就是说,当您想要开始跟踪时间间隔时,可以调用
Timer.start()
,每次想要记录时间间隔时,都可以调用
Timer.tick()
。然后,在快速的事情结束后,你可以回顾记录的时间间隔列表;也许可以解释平均值和1%的高点之类的

另外,因为我经常使用它,我想任意询问计时器从午夜到现在已经过去了多少微秒

这个虚构类的构造函数的第一个任务是在内部设置。最初,我是通过奇妙答案的技巧来做这件事的。当我去实现我的
定时器
类的概念时,我意识到我想要使用
高分辨率时钟
稳定时钟
(即使
系统时钟
在我的平台上使用纳秒间隔)。然后问题出现了:如何将
chrono::stable\u clock::time\u point
设置为午夜

只有
系统时钟
到时间
从时间
,就我所知,这是用
时钟
理解的方式表达“今天午夜”的唯一方式。尽管我昨晚读了这么多书,我还是找不到办法把系统时钟时间点转换成稳定的时钟时间点。我最近的尝试是:

typedef std::conditional<std::chrono::high_resolution_clock::is_steady,
                         std::chrono::high_resolution_clock,
                         std::chrono::steady_clock>::type TimerClock;

TimerClock::time_point midnight;

chrono::system_clock::time_point current_time = chrono::system_clock::now();

time_t raw_time = chrono::system_clock::to_time_t(current_time);

tm *tm_midnight = localtime(&raw_time);
tm_midnight->tm_hour = 0;
tm_midnight->tm_min  = 0;
tm_midnight->tm_sec  = 0;

midnight = chrono::system_clock::from_time_t(mktime(tm_midnight));
typedef std::conditional::type TimerClock;
TimerLock::时间点午夜;
时钟::系统时钟::时间点当前时间=时钟::系统时钟::现在();
时间\u t原始时间=时钟::系统时钟::到时间\u t(当前时间);
tm*tm_午夜=本地时间(&raw_时间);
tm_午夜->tm_小时=0;
tm_午夜->tm_分钟=0;
tm_午夜->tm_秒=0;
午夜=时钟::系统时钟::从时间开始(mktime(tm_午夜));
但很明显,这是行不通的。据我所知,
chrono::time\u point\u cast
的设计目的是让您能够从相同的时钟类型中访问不同的分辨率

这给我留下了两条路线/问题:

  • 我可以直接将
    高精度时钟
    稳定时钟
    中的
    时间点的值设置为“今天午夜”吗
  • 我是否可以将
    系统时钟::时间点
    转换为与不同的
    时钟
    一起使用
当然,我很高兴能找到一个更好的方法来处理这一切,如果它仍然符合我上面的总体目标的话


提前感谢。=)

在系统时钟上计算午夜

在“同一时间”(大约)为系统时钟和您想要的午夜时钟获取一个时间点。称这个时间点为X

将系统时钟上的时间间隔从午夜转换为X。转换为以皮秒(或任何分辨率)为单位的持续时间

现在,您有了从午夜开始的时间,单位为皮秒,表示您希望午夜开始的时钟上的时间点X


请注意,这基本上是近似值,因为“时间X”将是系统时钟和您关心的时钟之间的一条线。但它只会在计算时间戳所需的时间上有所不同。如果你真的在乎,你可以做两个系统时钟样本来记录目标时钟,并从午夜开始计算时间的平均值。

一个复杂的问题是,系统时钟可能会一年跳两次一小时(DST)。稳定的时钟不是。啊,是的。就我而言,这个计时器的运行时间不会超过几个小时。我有时会在程序启动时捕获一个时间点。任何后续时间点都可以计算程序开始后的持续时间。这是否合理?我确信启动时间点可以通过“挂钟”时间捕捉到。我认为这将是一个简单的模块化算法,将所有圈速调整为毫秒-从午夜开始。是的,这将是一个更简单的方法。如果我满足于让它只是一个秒表,那我就会这么做。但我也希望能从午夜开始任意地问它几秒钟。即为日志消息添加时间戳。每个滴答声的持续时间总是在同一个时钟上,所以这个问题实际上只是为了拥有一个
us\u aster\u midnight()
成员函数。