背景
使用 C++ 而不是 C 的方法来实现时间戳转换问题。
方法
- 简化
#include <ctime>
#include <chrono>
#include <iomanip>
using sys_clock = std::chrono::system_clock;
using time_point_t = sys_clock::time_point;
using time_duration_t = sys_clock::duration; // 时间间隔
- 获取当前时间
time_point_t getNowTimePoint() {return sys_clock::now();
}
- 时间戳比较
bool cmpTimePoint(time_point_t &time1, time_point_t &time2) {return time1 < time2;
}
- 获取之前(或之后)的一个时间点
// 1小时
time_duration_t m_hour_duration = std::chrono::hours(1);// 1 天
time_duration_t m_day_duration = std::chrono::hours(24 * 1); // 时间前
time_point_t getBeforeTimePoint(time_point_t &tp, time_duration_t &dur) {return tp - dur;
}// 时间后
time_point_t getAfterTimePoint(time_point_t &tp, time_duration_t &dur) {return tp + dur;
}
- 时间戳转字符串
// 转成 "YYYYmmDDTHHMMSS111" 格式,精确到 ms
std::string getTimeStr(time_point_t &tp) {std::time_t time = sys_clock::to_time_t(tp);auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());auto millis = ms.count() % 1000;std::ostringstream oss;oss << std::put_time(std::localtime(&time), "%Y%m%dT%H%M%S")<< std::setw(3) << std::setfill('0') << millis;return oss.str();
}
- 字符串转时间戳
// 从 "YYYYmmDDTHHMMSS111" 转入
time_point_t getTimePointFromStr(const std::string &raw_time) {std::istringstream ss(raw_time);std::tm tm{};ss >> std::get_time(&tm, "%Y%m%dT%H%M%S");std::time_t time = std::mktime(&tm);return sys_clock::from_time_t(time);
}
结论
通过灵活使用 c++ 中的 std::chrono 库实现时间戳比 c 语言的方法要更方便。