如何将毫秒添加到纪元以来的持续时间?

How to add milliseconds to the time duration since epoch?

仅使用 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() 不是 return 自 1970 年 1 月 1 日以来经过的时间量(以毫秒表示)吗?

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();

count() duration class returns 表示的成员函数 periods,是内部的。 不一定是秒或毫秒,它只是一种内部表示。您可以手动设置 duration class 的周期,由 time_since_epoch() 函数返回。

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

现在 duration class 的周期值为毫秒。

时间的开始

std::chrono::time_point::time_since_epoch 不是 return 从 1970 年 1 月 1 日开始的时间,而不是时钟的 纪元 实施定义。 Epoch 仅表示在应用程序会话中保持不变的固定时间点。

例如,在我的系统上std::chrono::time_point::time_since_epoch return自上次系统启动以来的时间。

单位

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();