说明:只供学习交流,转载请注明出处
日历时间(Calendar Time):通过time_t数据类型来表示,从一个时间点(通常是1970年1月1日0时0分0秒)到此时的秒数。
格林威治时间(Greenwich Mean Time GMT):由英国皇家格林尼治天文台提供的标准时间。
本地时间(Local Time):根据格林威治时间和本地时区计算出的时间。
tm结构体:
tm结构体(Time Structure)是C语言中用于表示日期和时间的结构体,几个重要的时间函数都与它相关。它总共包含8个成员,它们分别是:
struct tm
{
int tm_sec; //表示秒数,在[0,61]之间,多出来的两秒是用来处理跳秒问题
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]之间,润年有366日
int tm_isdst; //表示是否为日光节约时间
};
time函数
头文件 | #include <time.h> |
函数原型 | time_t time(time_t timer); |
返回值 | 返回日历时间 |
功能:获取当前的系统时间
参数说明:timer=NULL时得到系统的日历时间,timer=时间数值时,用于设置日历时间。
localtime函数
头文件 | #include <time.h> |
函数原型 | struct tm* localtime(const time_t *clock); |
返回值 | 返回指向tm结构体的指针 |
函数功能:通过日历时间获得本地时间,并保存至tm结构体。
参数说明:clock指向日历时间的指针变量。
gmtime函数
头文件 | #include <time.h> |
函数原型 | struct tm *gmtime(long *clock); |
返回值 | 返回指向tm结构体的指针 |
函数功能:通过日历时间获得格林威治时间,并保存至tm结构体。
参数说明:clock是指向日历时间的指针变量。
asctime函数
头文件 | #include <time.h> |
函数原型 | Char *asctime(const struct tm *tblock); |
返回值 | 返回字符串格式:星期,月,日,小时:分:秒,年 |
函数功能:将tm格式的时间转换为字符串,如Sat Jul 30 08:43:03 2005
参数说明:tblock记录时间的tm结构体。
ctime函数
头文件 | #include <time.h> |
函数原型 | Char *ctime(const time_t *time); |
返回值 | 返回字符串格式:星期,月,日,小时:分:秒,年 |
函数功能:把日期和时间转换为字符串。
参数说明:time为指向日历时间的指针变量,该参数因由函数time函数获得。
gettimeofday函数
头文件 | #include <time.h> |
函数原型 | int gettimeofday(struct timeval *tv, struct timezone *tz); |
返回值 | 成功返回0,失败返回-1 |
函数功能:获取从今日凌晨到现在的时间差,常用于计算时。或者说取得当前时间。
参数说明:tv为当前timeval结构,tz为时区结构。
struct timeval
{
int tv_sec ;//秒数
int tv_usec; //微秒数
}
settimeofday函数
头文件 | #include <time.h> |
函数原型 | int settimeofday(const struct timeval *tv, const struct timezone *tz); |
返回值 | 成功返回0,失败返回-1 |
函数功能:把日期和时间转换为字符串
参数说明:tv为当前timeval结构,tz为时区结构
实例:
#include <time.h>
#include <stdio.h>
int main(void)
{
struct tm *ptr = NULL;
struct tm *str = NULL;
time_t lt;
lt = time(NULL);
ptr = gmtime(<);
str = localtime(<);
printf(asctime(str));
printf(asctime(ptr));
printf(ctime(<));
return (0);
}
运行结果:
[root@localhost test]# ./time
Mon May 6 18:55:08 2013
Mon May 6 18:55:08 2013
Mon May 6 18:55:08 2013
总结:
要获取本地时间字符串,一般需要三个步骤:
(1):通过time函数获得日历时间。
(2):通过localtime函数将日历时间转化为本地时间并保存在tm结构体中。
(3):通过asctime函数将本地时间转化为字符串。
当然,可以不经过步骤(2),直接使用ctime从日历时间获取时间字符串。但实际上它们内部实现是一样的。
在实际中,很多时候并不需要asctime函数转换的固定格式字符串。通常是通过localtime函数获得表示本地时间的tm结构体,再通过此结构体成员输出自定义时间字符串格式。因此可以通过tm结构体更加灵活的获得时间字符串。
实例:
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <string.h>
char *weekday[] = {
"Sun", "Mon","Tue", "Wed", "Thu", "Fri","Sat"
};
char *Asctime(const struct tm *timeptr)
{
static char ts[256];
bzero(ts, 256);
sprintf(ts, "%s %d %d %02d:%02d:%02d %d",
weekday[timeptr->tm_wday],
timeptr->tm_mon+1,timeptr->tm_mday,
timeptr->tm_hour,timeptr->tm_min,
timeptr->tm_sec,timeptr->tm_year + 1900);
return (ts);
}
int main(int argc, char *argv[])
{
struct tm *ptm;
time_t t = time(NULL);
ptm = localtime(&t);
printf("%s\n", Asctime(ptm));
return (0);
}
运行结果:
[root@localhost test]# ./asctime
Mon 5 6 20:03:46 2013