背景
使用 C++ 的 chrono 库 的方法来实现时间戳转换问题。
方法
- 简化
#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);
}
- 时间戳转时间点
time_point_t getTimePointFromTimestamp(long long timestamp) {
int ms = timestamp % 1000;
std::time_t time = (std::time_t)(timestamp/1000);
return sys_clock::from_time_t(time);
}
结论
通过灵活使用 c++ 中的 std::chrono 库实现时间戳比 c 语言的方法要更方便。