【小算法】chrono 库实现时间戳转换

背景

使用 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 语言的方法要更方便。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值