编写这个自定义时钟的难点在于弄清楚如何编写now()
函数。在下面的示例中,我基于system_clock
的now()
关闭now()
。首先,我做一些侦探工作,发现我的system_clock
有一个1970年新纪元,忽略了leap seconds。这就是所谓的unix time。事实证明,我知道的每个实现(我认为我已经检查过它们)具有这个非常相同的时代(但这是C++ 11标准未指定的)。
接下来我计算出1988-07-13是1970-01-01之后的6768天。使用这两个事实,剩下的很简单:
#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)
);
}
};
MyClock
需要嵌套类型定义来描述其duration
,rep
,period
和time_point
。根据你的问题,我选择seconds
作为duration
,但你可以选择任何你想要的。
对于now()
函数,我只需拨打system_clock::now()
并以秒为单位减去纪元。通过写入所有关于MyClock::duration
的内容,我对此计算有点聪明,这样我可以更容易地更改duration
。请注意,我能够从hours
中减去时期,这隐含地转换为duration
(即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';
}
这对我来说只是打印出来:
786664963
这表明今天(2013-06-16)在1988-07-13之后约为24.9年。
我敢打赌,标准有要求列出。 – chris 2013-05-14 00:24:39
'time_point'接受'Clock'作为模板,这是一个概念。你可以编写自己的类,以满足特定概念所要求的要求。但是不要只说我的话,我只是在大声思考。 – 2013-05-14 00:28:11
@DanielKamilKozar我看了一下system_clock的源代码,但是我没有想太多。我没有看到实际时期在哪里指定。我认为这取决于系统。我在哪里可以找到关于如何做这种事情的文档? – sagargp 2013-05-14 03:41:00