仅使用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日以来以毫秒为单位的时间量吗?
答案 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();