如何创建用于std :: chrono函数的自定义时钟?

时间:2013-05-14 00:13:46

标签: c++ c++11 chrono

我有一些任意的时代,比如1988年7月13日。基本上我想测量相对于此的时间。我正在考虑编写一个自定义时钟类,以便我可以编写这样的代码:

using std::chrono;
time_point<My_Clock> tp;
std::cout << duration_cast<seconds>(tp.time_since_epoch()).count() << std::endl;

这可能吗?如果没有,最简洁的方法是什么?

1 个答案:

答案 0 :(得分:28)

编写此自定义时钟的难点在于弄清楚如何编写其now()函数。在下面的示例中,我将now()设置为system_clock的{​​{1}}。首先,我做了一些侦探工作,发现我的now()有一个1970年新时代,忽视了leap seconds。这称为unix time。事实证明,我所知道的每一个实现(我认为我已经检查过它们)都有这个相同的时代(但是C ++ 11标准没有指定)。

接下来我计算1988-07-13是1970-01-01之后的6768天。使用这两个事实,其余的很容易:

system_clock

#include <chrono> struct My_Clock { typedef std::chrono::seconds duration; typedef duration::rep rep; typedef duration::period period; typedef std::chrono::time_point<My_Clock> time_point; static const bool is_steady = false; static time_point now() noexcept { using namespace std::chrono; return time_point ( duration_cast<duration>(system_clock::now().time_since_epoch()) - hours(6768*24) ); } }; 需要嵌套的typedef来描述其MyClockdurationrepperiod。根据您的问题,我选择time_point作为seconds,但您可以选择任何内容。

对于duration函数,我只需调用now()并以秒为单位减去纪元。通过用system_clock::now()编写所有内容,我对这个计算有点聪明,这样我就可以更容易地改变MyClock::duration。请注意,我能够以duration的形式减去时代,隐式转换为hoursduration)。或者,我可以自己构建一个自定义的seconds天:

duration

然后可以写出typedef std::chrono::duration<int, std::ratio_multiply<std::chrono::hours::period, std::ratio<24>>> days; 的回复:

now()

无论如何,现在你可以使用它:

        return time_point
          (
            duration_cast<duration>(system_clock::now().time_since_epoch()) -
            days(6768)
          );

对我来说只打印出来:

#include <iostream>

int
main()
{
    using namespace std::chrono;
    time_point<My_Clock> tp = My_Clock::now();
    std::cout << tp.time_since_epoch().count() << '\n';
}

这证明今天(2013-06-16)是在1988-07-13之后大约24。9年。