linux系统函数之mktime
在工作时需要修复时区转换功能。但是用了很长时间,记录遇到的坑
1、一些基本概念
(1)开始时间,linux时间从1970年1月1日开始计数,记录从1900年1月1日开始到现在的秒数。
(2)使用mktime的目的,将struct tm 结构的时间转换为从1970年至今的秒数。也就是UTC时间。
(3)有关的数据类型
① time_t
time_t类型,这本质上是一个长整数( long ),表示从1970-01-01 00:00:00到目前计时时间的秒数,timeval则精确到毫秒。
原型:time_t time(time_t *t);
② timeval
timeval类型,这是一个结构体类型,struct timeval 头文件为 time.h。
原型
struct timeval
{
time_t tv_sec; /* Seconds. */
//秒
suseconds_t tv_usec; /* Microseconds. */
//微秒
};
③ timezone
struct timezone
{
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of DST correction */
};
④ struct tm
tm结构,这本质上是一个结构体,里面包含了各时间字段。
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
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 */
};
2、函数简介
C语言库函数time.h中的时间函数,能将tm结构转化为time_t类型的时间戳(timestamp),也叫UTC时间,发生错误时返回-1;
发生错误的原因:linux上的man手册显示,如果指定的分解时间不能表示为日历时间(从Epoch开始的秒数),mktime()将返回(time_t) -1,并且不更改分解时间结构的成员。
意思是:当mktime(struct tm *tm)所需要转化的tm结构超出范围限制时,mktime会返回错误值-1。在linux中使用mktime时,多数用来设置RTC时间。笔者在使用mktime时出现-1的情况是没有搞清楚tm结构体中所表示的意义,把tm_year的值设置为当前年份。导致数值溢出发生错误。
3、可能遭遇的坑。
(1)多次调用mktime函数转换出来的小时数出错。
分析原因: mktime在函数内部对传进来的参数struct tm应该有内存申请操作。
解决方法:
① 使用指针作为参数传入
struct tm *tm = NULL;
time_t t;
time(&t);
tm = gmtime(&t);
printf(" use gmtime ,the time is :/n
year = %d /n
mon = %d /n
day = %d /n
hour = %d/n
min = %d/n
sec = %d/n",
tm->tm_year,
tm->tm_mon,
tm->tm_day,
tm->tm_hour,
tm->tm_min,
tm->tm_sec,
);
t = mktime(tm);
printf("mktime = %lld /n",t);
②在使用之前重新分配内存
time_t t_time = 0;
struct tm tm_time = {'\0'};
time(&t_time);
memset(&tm_time , 0 ,sizeof(tm_time));
printf("first t_time = %lld /n",t_time);
t_time = mktime(&tm_time);
printf("secend mktime_t_time = %d/n",t_time);
(2)使用时返回值为-1
分析原因:传入的struct tm 数据溢出。或者是不符合格式。
解决方法:检查自己传入的参数数据是否溢出,比如年份tm_year 是表示从1900年到目前计时时间间隔多少年。月份是从1月开始计算。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)