日期时间库(2)-时间点

时间点是特定时钟的纪元开始经过的时间时长。文章的代码库:

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

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值