原:http://blog.csdn.net/water_cow/article/details/7521567
简介
本文旨在为了解Linux各种时间类型与时间函数提供技术文档。
1、Linux下常用时间类型
Linux下常用时间类型有四种:time_t、struct tm、struct timeval、struct timespec
1.1 time_t时间类型
time_t类型在time.h中定义:
#ifndef __TIME_T
#define __TIME_T
typedef long time_t;
#endif
#ifndef _TM_DEFINED
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],0代表星期天,1代表星期1,以此类推*/
int tm_yday; /*从每年的1月1日开始的天数-取值区间为[0, 365],0代表1月1日*/
int tm_isdst; /*夏令时标识符,使用夏令时,tm_isdst为正,不使用夏令时,tm_isdst为0,不了解情况时,tm_isdst为负*/
};
#define _TM_DEFINED
#endif
Struct tmieval{
time_t tv_sec; /*秒s*/
suseconds_t tv_usec; /*微秒us*/
};
struct timespec{
time_t tv_sec; /*秒s*/
long tv_nsec; /*纳秒ns*/
};
time_t seconds;
seconds = time((time_t *)NULL);
time_t timep;
tmep = time(NULL);
printf("%s\n", ctime(&timep));
int main(void)
{
char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
time_t timep;
struct tm *p_tm;
timep = time(NULL);
p_tm = gmtime(&timep); /*获取GMT时间*/
printf("%d-%d-%d ", (p_tm->tm_year+1900), (p_tm->mon+1), p_tm->tm_mday);
printf("%s %d:%d:%d\n", wday[p_tm->tm_wday], p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);
}
int main(void)
{
char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
time_t timep;
struct tm *p_tm;
timep = time(NULL);
p_tm = localtime(&timep); /*获取本地时区时间*/
printf("%d-%d-%d ", (p_tm->tm_year+1900), (p_tm->mon+1), p_tm->tm_mday);
printf("%s %d:%d:%d\n", wday[p_tm->tm_wday], p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);
return 0;
}
int main(void)
{
time_t timep1, timep2;
timep1 = time(NULL);
sleep(2);
timep2 = time(NULL);
printf("the difference is %f seconds\n", difftime(timep1, timep2));
return 0;
}
struct timezone{
int tz_minuteswest; /*miniutes west of Greenwich*/
int tz_dsttime; /*type of DST correction*/
};
struct timeval tv;
struct timeval tz;
gettimeofday(&tv, &tz);
int main(void)
{
char strtime[20] = {0};
time_t timep;
struct tm *p_tm;
timep = time(NULL);
p_tm = localtime(&timep);
strftime(strtime, sizeof(strtime), "%Y-%m-%d %H:%M:%S", p_tm);
return 0;
}
字符串转为timestamp
int64_t DiscoveryRecorder::string_to_timestamp( const char *src )
{
if( is_null_date( src ) )
return 0;
struct tm mytm;
memset( &mytm, 0, sizeof( struct tm ) );
strptime( src, "%Y-%m-%d %H:%M:%S", &mytm );
return mktime( &mytm );
}
2.获得当前时间
在所有的UNIX下,都有个time()的函数
time_t time(time_t *t);
这个函数会传回从epoch开始计算起的秒数,如果t是non-null,它将会把时间值填入t中。
对某些需要较高精准度的需求,Linux提供了gettimeofday()。
int gettimeofday(struct timeval * tv,struct timezone *tz);
int settimeofday(const struct timeval * tv,const struct timezone *tz);
struct tm格式时间函数
struct tm * gmtime(const time_t * t);
转换成格林威治时间。有时称为GMT或UTC。
struct tm * localtime(const time_t *t);
转换成本地时间。它可以透过修改TZ环境变数来在一台机器中,不同使用者表示不同时间。
time_t mktime(struct tm *tp);
转换tm成为time_t格式,使用本地时间。
tme_t timegm(strut tm *tp);
转换tm成为time_t格式,使用UTC时间。
double difftime(time_t t2,time_t t1);
计算秒差。
3.文字时间格式函数
char * asctime(struct tm *tp);
char * ctime(struct tm *tp);
这两个函数都转换时间格式为标准UNIX时间格式。
Mon May 3 08:23:35 1999
ctime一率使用当地时间,asctime则用tm结构内的timezone资讯来表示。
size_t strftime(char *str,size_t max,char *fmt,struct tm *tp);
strftime有点像sprintf,其格式由fmt来指定。
%a : 本第几天名称,缩写。
%A : 本第几天名称,全称。
%b : 月份名称,缩写。
%B : 月份名称,全称。
%c : 与ctime/asctime格式相同。
%d : 本月第几日名称,由零算起。
%H : 当天第几个小时,24小时制,由零算起。
%I : 当天第几个小时,12小时制,由零算起。
%j : 当年第几天,由零算起。
%m : 当年第几月,由零算起。
%M : 该小时的第几分,由零算起。
%p : AM或PM。
%S : 该分钟的第几秒,由零算起。
%U : 当年第几,由第一个日开始计算。
%W : 当年第几,由第一个一开始计算。
%w : 当第几日,由零算起。
%x : 当地日期。
%X : 当地时间。
%y : 两位数的年份。
%Y : 四位数的年份。
%Z : 时区名称的缩写。
%% : %符号。
char * strptime(char *s,char *fmt,struct tm *tp);
如同scanf一样,解译字串成为tm格式。
%h : 与%b及%B同。
%c : 读取%x及%X格式。
%C : 读取%C格式。
%e : 与%d同。
%D : 读取%m/%d/%y格式。
%k : 与%H同。
%l : 与%I同。
%r : 读取"%I:%M:%S %p"格式。
%R : 读取"%H:%M"格式。
%T : 读取"%H:%M:%S"格式。
%y : 读取两位数年份。
%Y : 读取四位数年份。
下面举一个小例子,说明如何获得系统当前时间:
time_t now;
struct tm *timenow;
char strtemp[255];
time(&now);
timenow = localtime(&now);
printf("recent time is : %s \n", asctime(timenow))