C/C++时间处理的易错点
在C/C+++中,我用到的关于时间的表达类型主要有3种,分别是time_t类型、tm类型、ptime类型,其中ptime类型来自于boost库,对时间的加减等操作十分友好,使用起来最为方便。
tm类型是一个直接存储年月的结构体:
struct tm
{
int tm_sec; // seconds after the minute - [0, 60] including leap second
int tm_min; // minutes after the hour - [0, 59]
int tm_hour; // hours since midnight - [0, 23]
int tm_mday; // day of the month - [1, 31]
int tm_mon; // months since January - [0, 11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday - [0, 6]
int tm_yday; // days since January 1 - [0, 365]
int tm_isdst; // daylight savings time flag
};
关于这个表示时间的结构体有3个地方需要特别的注意:
1、年份计算是从1900年起至今多少年,而不是直接存储年份如2020年;
2、它的tm_mday大多按照人类思维设计的,除了tm_mon(0-11),也就是6月份的时候你打印出来的这个值是5;
3、tm_wday表示一周中的第几天,是从星期日算起(0-6)
在代码中使用tm格式的时间会遇到的问题就是对tm格式时间的tm_mday进行加法操作的时候会出现大于31天的结果,时分秒月应该也会有此情况,工作太多来不及写demo测试了。
而使用mktime(struct tm* timeptr)将上述超出每月31天的时间转换成time_t格式会得到正确的时间,包括tm格式的时间也会被纠正,但是直接使用boost库的时间转换函数boost::posix_time::ptime_from_tm(const tm &timetm)转换超出范围的tm格式时间则会报错,最直接的解决办法是先将tm转换成time_t格式再使用boost::posix_time::from_time_t(time_t t)进行转换。
既然如此麻烦,我们何不直接使用boost时间库呢,直接对时间操作得到合理的时间。
比如获取当前时间:
boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
当前时间增加一天(会自动根据现实时间进行转换,比如5.31日增加一天是6.1日)
boost::posix_time::ptime time = now + boost::gregorian::days(1);
ptime转换成tm:
tm tmTime = boost::posix_time::to_tm(time);
ptime转换成time_t:
time_t timeTemp = boost::posix_time::to_time_t(time);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具