如何添加毫秒到epoch以来的持续时间?

时间:2015-07-23 12:19:14

标签: c++ time chrono

仅使用std::chrono库,我有一个类型为unsigned long的变量,表示从1970年1月1日到现在的毫秒数,我想为它添加100毫秒。

unsigned long now = std::chrono::system_clock::now().time_since_epoch().count();
unsigned long t100ms = std::chrono::milliseconds(100).count();
unsigned long time = now + t100ms;

打印t100ms时,我得到" 1000"。

如果我每打印std::chrono::system_clock::now的值,我会看到递增的数字在每次迭代时增加1000(因为1秒是等于1000毫秒,应该是这样的。)

问题

std::chrono::system_clock::now().time_since_epoch()不会返回自1970年1月1日以来以毫秒为单位的时间量吗?

3 个答案:

答案 0 :(得分:4)

std::chrono::system_clock::now().time_since_epoch()是自纪元以来的已用时间,以系统时钟选择使用的任何单位表示;这些可能是阿秒,或几年,或介于两者之间的任何事情。显然,在几纳秒(例如)上添加一些毫秒是没有意义的。

如果要对持续时间值执行算术运算,则应保留持续时间类型,因为它们将为您执行单位转换,并且只在您要打印结果时调用count()

auto now = std::chrono::system_clock::now().time_since_epoch();
auto t100ms = std::chrono::milliseconds(100);
auto time = now + t100ms;
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(time).count();

答案 1 :(得分:2)

count()类的

duration成员函数返回期间中的表示,这是内部的。 它不是必需的将是秒或毫秒,它只是一个内部表示。您可以为duration类手动设置句点,由time_since_epoch()函数返回。

std::chrono::milliseconds foo = std::chrono::system_clock::now().time_since_epoch();

现在你有duration类的句点值是毫秒。

答案 2 :(得分:1)

时间的开始

std::chrono::time_point::time_since_epoch 从1970年1月1日起必须返回时间,而时钟的纪元是实现定义的。 Epoch仅用于表示在应用程序会话中保持不变的固定时间点。

例如,在我的系统std::chrono::time_point::time_since_epoch上返回自最近系统启动以来的时间。

单元

std::chrono库中的日期和时间实用程序旨在使用无单位时间量。这是,例如,允许添加两个具有不同单位的持续时间,如小时和纳秒。单位转换会自动执行。

如果您想用特定单位表达时间金额,请使用std::chrono::duration_cast。另外,要将时间数量表示作为数字,请使用std::chrono::duration::count

using namespace std::literals; // To enable duration literals as, e.g., 100ms.
auto time = std::chrono::steady_clock::now().time_since_epoch() + 100ms;
std::cout << "Ms: " << std::chrono::duration_cast<decltype(1ms)>(time).count();