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,并且不更改分解时间结构的成员。

        意思是:当mktimestruct 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月开始计算。

Logo

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

更多推荐