设为首页 加入收藏

TOP

C++ 日期和时间编程总结(三)
2023-07-23 13:35:33 】 浏览:89
Tags:++日 时间编 程总结
d::chrono::time_point<std::chrono::steady_clock> now1 = std::chrono::steady_clock::now(); auto now2 = std::chrono::steady_clock::now();

3.2,与C-style转换

system_clock 与另外两个 clock 不一样的地方在于,它还提供了两个静态函数用来将 time_point 与 std::time_t 来回转换。

名称 说明
to_time_t 将系统时钟时间点转换为 time_t
from_time_t time_t 转换到系统时钟时间点

第一篇参考链接的文章给出了下面这幅图来描述 c 风格和 c++11 的几种时间类型的转换:

image

3.3,时长 ratio

为了支持更高精度的系统时钟,C++11 新增了一个新的头文件 <ratio> 和类型,用于自定义时间单位。std::ratio 是一个模板类,提供了编译期的比例计算功能,为 std::chrono::duration 提供基础服务。其声明如下:

template<
    std::intmax_t Num,
    std::intmax_t Denom = 1
> class ratio;

第一个模板参数 Num (numerator) 表示分子,第二个参数 Denom (denominator) 表示分母。typedef ratio<1, 1000> milli; 表示一千分之一,因为约定了基本计算单位是秒,所以 milli 表示一千分之一秒。所以通过 ratio 可以表示毫秒、微秒、纳秒等

typedef ratio<1,1000000000> nano; // 纳秒单位
typedef ratio<1,1000000> micro; // 微秒单位
typedef ratio<1,1000> milli; // 毫秒单位
typedef ratio<1,1> s // 秒单位

ratio 能表达的数值不仅仅是以 10 为基底的,同时也可以表达任意的分数秒,例如:5/7秒,89/23409 秒等等对于一个具体的 ratio 来说,可以通过 den 获取分母的值,num 获取分子的值。不仅仅如此, 头文件还包含了: ratio_add,ratio_subtract,ratio_multiply,ratio_divide 来完成分数的加减乘除四则运算。例如,想要计算 5/7+59/1023,可以用以下代码表示:

ratio_add<ratio<5, 7>, ratio<59, 1023>> result;
double value = ((double) result.num) / result.den;
cout << result.num << "/" << result.den << " = " << value << endl;
// 代码输出结果是 5528/7161 = 0.771959

C++中,如果分子和分母都是整形,则整形除法结果依然是整形,即小数点右边部分会被抛弃,因此想要获取 double 类型的结果,需要先将其转换成 double

3.3.1,时长运算

时长对象之间可以进行相加或相减运算。chrono 提供了以下几个常用时长运算的函数

函数 说明
duration_cast 进行时长的转换
floor(C++17) 以向下取整的方式,将一个时长转换为另一个时长
ceil(C++17) 以向上取整的方式,将一个时长转换为另一个时长
round(C++17) 转换时长到另一个时长,就近取整,偶数优先
abs(C++17) 获取时长的绝对值

3.4,时间间隔 duration

类模板 std::chrono::duration 表示时间间隔,其声明如下:

template<
    class Rep,
    class Period = std::ratio<1>
> class duration;

类成员类型描述:

member type definition notes
rep The first template parameter (Rep) Representation type used as the type for the internal count object.
period The second template parameter (Period) The ratio type that represents a period in seconds.

durationRep 类型的计次数Period 类型的计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。存储于 duration 的数据仅有 Rep 类型的计次数。若 Rep 是浮点数,则 duration 能表示小数的计次数。 Period 被包含为时长类型的一部分,且只在不同时长间转换时使用。

  • Rep 表示一种数值类型,用来表示 Period 的数量,比如 int float double (count of ticks)。
  • Period 是 std::ratio 类型,用来表示【用秒表示的时间单位】比如 second milisecond (a tick period)。
  • 成员函数 count() 返回 Rep 类型的 Period 数量。

常用的 duration<Rep, Period> 已经定义好了,在 std::chrono 头文件中,常用时长单位的代码如下:

/// nanoseconds
typedef duration<int64_t, nano> 	nanoseconds;
/// microseconds
typedef duration<int64_t, micro> 	microseconds;
/// milliseconds
typedef duration<int64_t, milli> 	milliseconds;
/// seconds
typedef duration<int64_t> 		seconds;
/// minutes
typedef duration<int, ratio< 60>> 	minutes;
/// hours
typedef duration<int, ratio<3600>> 	hours;
类型 定义
std::chrono::nanoseconds duration</*至少 64 位的有符号整数类型*/, std::nano>
std::chrono::microseconds duration</*至少 55 位的有符号整数类型*/, std::micro>
std::chrono::milliseconds duration</*至少 45 位的有符号整数类型*/, std::milli>
std::chro
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇<二>函数调用过程中对象优化 下一篇Linux 基础-文件权限与属性

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目