时间点是特定时钟的纪元开始经过的时间时长。文章的代码库:
https://gitee.com/gamestorm577/CppStd
time_point
类模版std::chrono::time_point表示时间中的一个点,它保存了一个duration类型的值,表示从clock纪元开始的时间间隔:
template<class Clock, class Duration = typename Clock::duration>
class time_point;
构造函数
默认的构造函数创建一个表示clock纪元的时间点(即duration为零),也可以接受一个duration参数,表示从纪元开始加上duration的时间点,例如:
using namespace std::chrono;
time_point<system_clock> t1;
time_point<system_clock> t2(microseconds(50000));
time_since_epoch
返回该时间点距离clock纪元时间的duration,例如:
using namespace std::chrono;
time_point<system_clock> t1;
time_point<system_clock> t2(microseconds(50000));
printf("t1 time_since_epoch = %lld\n", t1.time_since_epoch().count());
printf("t2 time_since_epoch = %lld\n", t2.time_since_epoch().count());
输出结果为:
t1 time_since_epoch = 0
t2 time_since_epoch = 50000
运算符
运算符用于修改时间点。
operator+=和operator-=以指定的duration修改时间点,例如:
using namespace std::chrono;
time_point<system_clock> t(microseconds(50000));
t += microseconds(500);
printf("t time_since_epoch = %lld\n", t.time_since_epoch().count());
输出结果为:
test1:
t time_since_epoch = 50500
operator+和operator-用于时间点和duration的加减,例如:
printf("test2: \n");
time_point<system_clock> t(microseconds(50000));
microseconds d(5000);
time_point<system_clock> t_add = t + d;
time_point<system_clock> t_sub = t - d;
printf("t_add time_since_epoch = %lld\n",
t_add.time_since_epoch().count());
printf("t_sub time_since_epoch = %lld\n",
t_sub.time_since_epoch().count());
输出结果为:
test2:
t_add time_since_epoch = 55000
t_sub time_since_epoch = 45000
operator==、 operator!=、operator<、operator<=、operator>、operator>=用于两个时间点的比较,比如:
printf("test3: \n");
time_point<system_clock> t1(microseconds(50000));
time_point<system_clock> t2(microseconds(5000));
printf("t1 == t2: %d\n", t1 == t2);
printf("t1 != t2: %d\n", t1 != t2);
printf("t1 < t2: %d\n", t1 < t2);
printf("t1 <= t2: %d\n", t1 <= t2);
printf("t1 > t2: %d\n", t1 > t2);
printf("t1 >= t2: %d\n", t1 >= t2);
输出结果为:
test3:
t1 == t2: 0
t1 != t2: 1
t1 < t2: 0
t1 <= t2: 0
t1 > t2: 1
t1 >= t2: 1
最大最小时间点
静态函数min、max分别获取最小时长和最大时长的时间点,例如:
using namespace std::chrono;
using t = time_point<system_clock>;
printf("t min = %lld\n", t::min().time_since_epoch().count());
printf("t max = %lld\n", t::max().time_since_epoch().count());
输出结果为:
t min = -9223372036854775808
t max = 9223372036854775807
time_point_cast
time_point_cast可以将时间点转换为同一个时钟上不同duration的另一个时间点,例如:
using namespace std::chrono;
using time_point1 = time_point<system_clock, hours>;
using time_point2 = time_point<system_clock, seconds>;
time_point1 t1(hours(1));
time_point2 t2 = time_point_cast<seconds>(t1);
printf("t1 time = %ld\n", t1.time_since_epoch().count());
printf("t2 time = %lld\n", t2.time_since_epoch().count());
输出结果为:
t1 time = 1
t2 time = 3600
转换取整
将时间点转换为同一个时钟上不同duration的另一个时间点时,转换的计次数可能不是整数,floor、ceil和round接口可以控制取整的方式。floor代表向下取整,ceil代表向上取整,round代表就近取整。例如:
using namespace std::chrono;
using time_point1 = time_point<system_clock, milliseconds>;
using time_point2 = time_point<system_clock, seconds>;
std::vector<time_point1> tp1_arr;
tp1_arr.emplace_back(milliseconds(4400));
tp1_arr.emplace_back(milliseconds(4900));
printf("Time point\tFloor\tCeil\tRound\n");
printf("(ms)\t\t(sec)\t(sec)\t(sec)\n");
for (auto& t : tp1_arr)
{
time_point2 t1 = floor<seconds>(t);
time_point2 t2 = ceil<seconds>(t);
time_point2 t3 = round<seconds>(t);
printf("%lld\t\t%lld\t\t%lld\t\t%lld\n", t.time_since_epoch().count(),
t1.time_since_epoch().count(), t2.time_since_epoch().count(),
t3.time_since_epoch().count());
}
输出结果为:
Time point Floor Ceil Round
(ms) (sec) (sec) (sec)
4400 4 5 4
4900 4 5 5
common_type
两个time_point的公共类型,其周期为两个time_point的duration的周期的最大公约数,例如:
using namespace std::chrono;
using time_point1 = time_point<system_clock, duration<int, std::ratio<20>>>;
using time_point2 = time_point<system_clock, duration<int, std::ratio<30>>>;
using c_type = std::common_type<time_point1, time_point2>;
c_type::type t(c_type::type::duration(1));
auto t_duration = t.time_since_epoch();
auto t_duration_sec = duration_cast<seconds>(t_duration);
printf("t_duration_sec count = %lld\n", t_duration_sec.count());
输出结果为:
t_duration_sec count = 10
clock_time_conversion
todo
clock_cast
todo