当前位置:首页系统教程C 语言 时间函数使用技巧(汇总)

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;
}
个人中心
今日签到
有新私信 私信列表
搜索