C语言时间函数总结

日常编程过程中经常会用到日期和时间,我们常常需要对日期和时间进行转换和处理,C语言time.h中为我们提供了这些函数。

一、时间的概念

通用协调时间(UTC, Universal Time Coordinated):是一个全球通用的时间标准,使用秒来计算。
格林尼治平均时(GMT, Greenwich Mean Time):基本上等同于UTC时间。
本地时间:整个地球分为24时区,本地时间是结合各地的时区进行计算的。本地时间 = UTC + 时区差,时区差东为正,西为负,比如北京为东八区,则时区差为+8。
Unix时间戳:在计算机中看到的UTC时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。 这个秒数就是Unix时间戳。

二、时间的数据类型

time_t :这个是用来存储unix时间戳的类型,大部分系统是定义为long型。
struct tm:一个用来保存时间和日期的结构。

struct tm {
   int tm_sec;         /* 秒,范围从 0 到 59      */
   int tm_min;         /* 分,范围从 0 到 59      */
   int tm_hour;        /* 小时,范围从 0 到 23     */
   int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */
   int tm_mon;         /* 月,范围从 0 到 11(注意)  */
   int tm_year;        /* 自 1900 年起的年数      */
   int tm_wday;        /* 一周中的第几天,范围从 0 到 6 */
   int tm_yday;        /* 一年中的第几天,范围从 0 到 365   */
   int tm_isdst;       /* 夏令时               */
};

struct timeval:一个保存秒和微妙信息的结构。

struct timeval {
    long tv_sec;  //秒
    long tv_usec;  //微秒
};

struct timezone:一个保存时区信息的结构

struct timezone {
    int tz_minuteswest;  /*和Greenwich 时间差了多少分钟*/
    int tz_dsttime;  	 /* 夏令时*/
};

三、时间的函数

函数说明
time获取当前经过的秒数
gmtime获取当前时间和日期
localtime获取当前时间和日期并转换为本地时间
timegm从tm时间转换到time_t时间,不考虑时区
timelocal从tm时间转换到time_t时间,考虑时区
mktime将时间转换成经过的秒数
asctime将时间日期以字符串格式表示
ctime将时间日期以字符串格式表示
gettimeofday获取当前时间
settimeofday设置当天时间戳

1、time

头文件:time.h
原型:time_t time(time_t *t);
说明:此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存。
返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno 中。
示例

#include <stdio.h>
#include <time.h>

int main() {
    int seconds = time(NULL);
    printf("seconds:%ld\n", seconds);
    return 0;
}

2、gmtime

头文件:time.h
原型:struct tm *gmtime(const time_t *timep);
说明:gmtime()将参数timep 所指的time_t 中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。此函数返回的时间日期未经时区转换,是UTC 时间。
返回值:返回结构tm 代表目前UTC 时间。
示例

#include <stdio.h>
#include <time.h>

int main() {
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t timep;
    struct tm *p;

    time(&timep);
    p = gmtime(&timep);
    printf("%d/%d/%d ", (p->tm_year+1900), (p->tm_mon+1), p->tm_mday);
    printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
    return 0;
}

3、localtime

头文件:time.h
原型:struct tm *localtime(const time_t * timep);
说明:localtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。此函数返回的时间日期已经转换成当地时区。
返回值:返回结构tm 代表目前的当地时间。
示例

#include <stdio.h>
#include <time.h>

int main() {
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t timep;
    struct tm *p;

    time(&timep);
    p = localtime(&timep); //取得当地时间
    printf("%d/%d/%d ", (p->tm_year+1900), (p->tm_mon+1), p->tm_mday);
    printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
    return 0;
}

4、timegm

头文件:time.h
原型:time_t timegm(struct tm *tm);
说明:gmtime()将参数tm所指的struct tm 中的信息转换成time_t 表示方法,然后将结果由time_t 返回。此函数返回的时间未经时区转换,是UTC 时间。
返回值:返回time_t 代表目前UTC 时间。
示例

#include <stdio.h>
#include <time.h>

int main() {
    time_t timep;
    struct tm *p;
    time(&timep);
    printf("time():%ld \n", timep);
    p = localtime(&timep);
    timep = timegm(p);
    printf("time()->localtime()->timegm():%ld\n", timep);
    return 0;
}

5、timelocal

头文件:time.h
原型:time_t timelocal(struct tm *tm);
说明:timelocal()将参数tm所指的struct tm 中的信息转换成time_t 表示方法,然后将结果由time_t 返回。此函数返回的时间日期已经转换成当地时区。
返回值:返回time_t 代表目前本地 时间。
示例

#include <stdio.h>
#include <time.h>

int main() {
    time_t timep;
    struct tm *p;
    time(&timep);
    printf("time():%ld \n", timep);
    p = localtime(&timep);
    timep = timelocal(p);
    printf("time()->localtime()->timelocal():%ld\n", timep);
    return 0;
}

6、mktime

头文件:time.h
原型:time_t mktime(strcut tm * timeptr);
说明:mktime()用来将参数timeptr 所指的tm 结构数据转换成从公元1970 年1 月1 日0 时0 分0 秒算起至今的UTC 时间所经过的秒数。
返回值:返回经过的秒数。
示例

#include <stdio.h>
#include <time.h>

int main() {
    time_t timep;
    struct tm *p;
    time(&timep);
    printf("time():%ld \n", timep);
    p = localtime(&timep);
    timep = mktime(p);
    printf("time()->localtime()->mktime():%ld\n", timep);
    return 0;
}

7、asctime

头文件:time.h
原型:char *asctime(const struct tm * timeptr);
说明:asctime()将参数timeptr 所指的tm 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。字符串格式为:“Tue Jun 1 18:10:22 2021”
返回值:返回一字符串表示目前时间日期。
示例

#include <stdio.h>
#include <time.h>

int main() {
    time_t timep;
    time(&timep);
    printf("%s", asctime(gmtime(&timep)));
    return 0;
}

8、ctime

头文件:time.h
原型:char *ctime(const time_t *timep);
说明:ctime()将参数timep 所指的time_t 的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为:“Tue Jun 1 18:10:22 2021”
返回值:返回一字符串表示目前当地的时间日期。
示例

#include <stdio.h>
#include <time.h>

int main() {
    time_t timep;
    time(&timep);
    printf("%s", ctime(&timep));
    return 0;
}

9、gettimeofday

头文件:sys/time.h和unistd.h
原型:int gettimeofday (struct timeval * tv, struct timezone * tz);
说明:gettimeofday()会把目前的时间有tv 所指的结构返回,当地时区的信息则放到tz 所指的结构中。
返回值:成功则返回0,失败返回-1,错误代码存于errno。
示例

#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    struct timeval tv;
    struct timezone tz;
    gettimeofday(&tv, &tz);
    printf("tv_sec:%ld\n", tv.tv_sec);
    printf("tv_usec:%ld\n", tv.tv_usec);
    printf("tz_minuteswest:%d\n", tz.tz_minuteswest);
    printf("tz_dsttime:%d\n", tz.tz_dsttime);
    return 0;
}

10、settimeofday

头文件:sys/time.h和unistd.h
原型:int settimeofday(const struct timeval *tv, const struct timezone *tz);
说明:settimeofday()会把目前时间设成由tv 所指的结构信息,当地时区信息则设成tz 所指的结构。
返回值:成功则返回0,失败返回-1,错误代码存于errno。
示例

#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    struct timeval tv;
    struct timezone tz;
    gettimeofday(&tv, &tz);
    printf("tv_sec:%ld\n", tv.tv_sec);
    printf("tv_usec:%ld\n", tv.tv_usec);
    printf("tz_minuteswest:%d\n", tz.tz_minuteswest);
    printf("tz_dsttime:%d\n", tz.tz_dsttime);

    tv.tv_sec += 3600;
    settimeofday(&tv, &tz);

    gettimeofday(&tv, &tz);
    printf("tv_sec:%ld\n", tv.tv_sec);
    printf("tv_usec:%ld\n", tv.tv_usec);
    printf("tz_minuteswest:%d\n", tz.tz_minuteswest);
    printf("tz_dsttime:%d\n", tz.tz_dsttime);
    return 0;
}

版权声明:本文为fddnihao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。