C++中关于时间的小结
1. 前言c 处理时间主要有两种风格c风格(ctime 和 c11 引入的 std::chrono库。2. C语言风格的时间2.1 核心数据结构time_t 通常是 长整形long or long long, 表示从1970年1月1日至今的总秒数clock_t 用于计算程序运行占用的cpu tick数(滴答数)struct tm 时间结构体分解时间将秒数分解为人类可读的年月日时分秒struct tm { int tm_sec; // 秒范围从 0 到 59 int tm_min; // 分范围从 0 到 59 int tm_hour; // 小时范围从 0 到 23 int tm_mday; // 一月中的第几天范围从 1 到 31 int tm_mon; // 月份范围从 0 到 11 (注意0表示1月) int tm_year; // 自 1900 年起的年数 (注意124表示2024年) int tm_wday; // 一周中的第几天范围从 0 到 6 (0表示周日) int tm_yday; // 一年中的第几天范围从 0 到 365 int tm_isdst; // 夏令时标识符 // POSIX 扩展 long tm_gmtoff; // 当前时区相对于 UTC 的秒数 const char *tm_zone; // 当前时区的名字比如 CST };struct timespec 精度为纳秒常配合 clock_gettime 接口struct timespec { time_t tv_sec; // 秒 (Seconds) long tv_nsec; // 纳秒 (Nanoseconds)范围 0 到 999,999,999 }; // 获取当前时间的时间戳 time_t getLocalTimeMs() { struct timespec ts {}; if (clock_gettime(CLOCK_REALTIME, ts) ! 0) { return 0; } return (ts.tv_sec * 1000u) ts.tv_nsec / 1000000u; }struct timevalsys/time.hC 中通常也可以通过ctime间接包含核心接口是 gettimeofday(tv, NULL), 常用于计算一段代码的耗时网络编程 select 超时时间等。struct timeval { time_t tv_sec; // 秒 (seconds) suseconds_t tv_usec; // 微秒 (microseconds) };2.2 主要功能接口 绑定struct tm结构体1. time(time_t* time) 获取当前系统的总秒数unix 纪元2. clock() 返回程序开始运行到现在的cpu 时钟计时单元数3. localtime(const time_t time) 将总秒数转换为本地时间 struct tm 格式4. gtime(const time_t time) 将总秒数转换为UTC格林威治时间的 struct tm 格式5. mktime(struct tm * time) 反向操作将 struct tm 结构体转换为 time_t 总秒数6. strftime(char* str, size_t max, const char* format, const struct tm* tp) 可以通过format指定格式如%Y-%m-%d %H:%M:%S7. strptime(const char* buf, const char* format, struct tm* time) strftime的逆向操作将字符串解析转换为 struct tm 结构体。2.3 转换关系图chrono 库参考 https://cppreference.cn/w/cpp/chrono