How to add milliseconds to the time duration since epoch?
Solution 1
std::chrono::system_clock::now().time_since_epoch()
is the elapsed time since epoch, expressed in whatever units the system clock chooses to use; these could be attoseconds, or years, or anything in between. Clearly, adding a number of milliseconds to a number of nanoseconds (for example) is nonsensical.
If you want to perform arithmetic on duration values, you should remain in the duration types as they will perform unit conversion for you, and only call count()
when you want to print out the result:
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();
Solution 2
count()
member function of the duration
class returns representation in periods, which is internal.
It's not necessary will be seconds or milliseconds, it's just an internal representation. You can set the period manually for duration
class, returned by time_since_epoch()
function.
std::chrono::milliseconds foo = std::chrono::system_clock::now().time_since_epoch();
Now you have period value of the duration
class is milliseconds.
Solution 3
Beginning of time
std::chrono::time_point::time_since_epoch
does not neccessarily return the time from 1 Jan 1970, instead the clock's epoch is implementation defined. Epoch is only meant to represent a fixed point in time that stays the same within an application session.
E.g., on my system std::chrono::time_point::time_since_epoch
returns the time since latest system start.
Units
The date and time utilities in the std::chrono
library are designed to work with unitless time amounts. This is to, e.g., enable adding two durations with different units as hours and nanoseconds. The unit conversions are performed automatically.
If you want to express time amounts with a specific unit, use std::chrono::duration_cast
. Also to get the time-amount representation as a number use 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();
waas1919
Updated on June 05, 2022Comments
-
waas1919 almost 2 years
Using only the
std::chrono
library, I have a variable with typeunsigned long
, representing the number of milliseconds from 1 Jan 1970 to now, and I want to add 100 milliseconds to it.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;
When printing
t100ms
, I get "1000
".If I print the value of
std::chrono::system_clock::now
every second, I see that the incrementing number is not increased with 1000 at each iteration (as 1 second is equal to 1000 milliseconds, this should be the case).Question
Does
std::chrono::system_clock::now().time_since_epoch()
not return the amount of time that has passed since 1 Jan 1970 represented in milliseconds?