Linux下的时间函数,写在这里,可以在大多数时候满足要求。
一、time函数
#include <time.h>
time_t time(time_t *t);
首先要用到的就是time函数了,用来获取系统时间。当然获取的时间是一个秒数而已,此时还不大实用。
在man手册中提到Epoch,这个Epoch指的是一个特定的时间:1970-01-01 00:00:00 UTC。这个描述就是从这个时间开始的秒数。这个秒数叫做unix时间戳。一个小时3600秒,一天86400秒,闰秒不计算。
如果时间戳的存储为32位,就会引发2038年问题(Y2038)。
函数使用方法:
time_t tp;
time(&tp);
该函数有返回值,也是秒数。
二、时间转换函数
Linux中提供的转换函数还是不少的,这里就有必要说下 struct tm 这个结构体了。Man手册里就有很详细的介绍:
struct tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
结构体成员介绍如下:
tm_sec取值范围0到59,到达60时分钟跳转
tm_min取值范围0到59
tm_hour 取值范围0到23
tm_mday 取值范围1到31
tm_mon 取值范围0到11,所以实际计算时需要加1
tm_year 距离1900年的年数,所以实际计算时需要加1900
tm_isdst 有关夏令时的设置,国内一般不用,因为我们没实行
下面是关于时间转换的一些函数。
使用时首先需要将time_t类型的秒数转换成结构体形式,gmtime和localtime有此作用
Asctime和ctime是将结构体形式的时间再转换为一定格式的字符串,不过大多时候我们都自己定制了字符串的格式。
需要说明的是,加了_r后缀的函数与原函数的区别。没加_r的函数tm结构体是静态变量,所以重复调用会导致覆盖,而_r的函数则需要调用者来保存这个结构体,不存在这个问题。
#include <time.h>
char *asctime(const struct tm *tm);
char *asctime_r(const struct tm *tm, char *buf);
char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);
struct tm *gmtime(const time_t *timep);
struct tm *gmtime_r(const time_t *timep, struct tm *result);
struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);
time_t mktime(struct tm *tm);
下面是我用到的代码,放在这里参考
time_t now;
time(&now);
struct tm tm_now = *(localtime(&now));
sprintf(defaultname, "%04d%02d%02d", 1900+tm_now.tm_year, 1+tm_now.tm_mon, tm_now.tm_mday);
三、关于__DATE__, __TIME__宏
简单说明下,这两个宏是获取程序的编译时间,前者获取年月日,后者获取时分秒,所以如果是要获取当前时间还是需要调用时间函数的。