linux 时间函数

来源:互联网 发布:淘宝画眉鸟活体 编辑:程序博客网 时间:2024/06/05 15:27
系统环境:ubuntu10.04

简介
本文旨在为了解Linux各种时间类型与时间函数提供技术文档。

1、Linux下常用时间类型
Linux下常用时间类型有四种:time_tstruct tmstruct timevalstruct timespec

1.1 time_t时间类型
time_t类型在time.h中定义:
[cpp] view plaincopyprint?
  1. #ifndef __TIME_T   
  2. #define __TIME_T   
  3. typedef  long  time_t;  
  4. #endif  
可见,time_t实际是一个长整型。其值表示为从UTC(coordinated universal time)时间197011000000(也称为Linux系统的Epoch时间)到当前时刻的秒数。由于time_t类型长度的限制,它所表示的时间不能晚于2038119031407秒(UTC)。为了能够表示更久远的时间,可用64或更长的整形数来保存日历时间,这里不作详述。
使用time()函数获取当前时间的time_t值,使用ctime()函数将time_t转为当地时间字符串。

备注UTC时间有时也称为GMT时间,其实UTCGMT两者几乎是同一概念。它们都是指格林尼治标准时间,只不过UTC的称呼更为正式一点。两者区别在于前者是天文上的概念,而后者是基于一个原子钟。

1.2 struct tm时间类型
tm结构在time.h中定义:
[cpp] view plaincopyprint?
  1. #ifndef _TM_DEFINED   
  2. struct tm{  
  3.     int tm_sec; /*秒 - 取值区间为[0, 59]*/  
  4.     int tm_min; /*分 - 取值区间为[0, 59]*/  
  5.     int tm_hour; /*时 - 取值区间为[0, 23]*/  
  6.     int tm_mday; /*日 - 取值区间为[1, 31]*/  
  7.     int tm_mon; /*月份 - 取值区间为[0, 11]*/  
  8.     int tm_year; /*年份 - 其值为1900年至今年数*/  
  9.     int tm_wday; /*星期 - 取值区间[0, 6],0代表星期天,1代表星期1,以此类推*/  
  10.     int tm_yday; /*从每年的1月1日开始的天数-取值区间为[0, 365],0代表1月1日*/  
  11.     int tm_isdst; /*夏令时标识符,使用夏令时,tm_isdst为正,不使用夏令时,tm_isdst为0,不了解情况时,tm_isdst为负*/  
  12. };  
  13. #define _TM_DEFINED   
  14. #endif  
ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)
使用gmtime( )localtime( )可将time_t时间类型转换为tm结构体;

使用mktime( )tm结构体转换为time_t时间类型;
使用asctime( )struct tm转换为字符串形式。
 
1.3 struct timeval时间类型
timeval结构体在time.h中定义:
[cpp] view plaincopyprint?
  1. Struct tmieval{  
  2.     time_t tv_sec; /*秒s*/  
  3.     suseconds_t tv_usec; /*微秒us*/  
  4. };  
设置时间函数settimeofday( )与获取时间函数gettimeofday( )均使用该事件类型作为传参。
 
1.4 struct timespec时间类型
timespec结构体在time.h定义:
[cpp] view plaincopyprint?
  1. struct timespec{  
  2.     time_t tv_sec; /*秒s*/  
  3.     long tv_nsec; /*纳秒ns*/  
  4. };  
 
2、Linux下常用时间函数
Linux下常用时间函数有:time( )ctime( )gmtime( )localtime( )mktime( )asctime( )difftime( )gettimeofday( )settimeofday( )

2.1 time( )函数
头文件:#include <time.h>
函数定义:time_t time(time_t *timer)
功能描述:该函数返回从197011000000秒至今所经过的秒数。如果time_t *timer非空指针,函数也会将返回值存到timer指针指向的内存。
返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。
例:
[cpp] view plaincopyprint?
  1. time_t seconds;  
  2. seconds = time((time_t *)NULL);  
2.2 ctime( )函数
头文件:#include <time.h>
函数定义:char *ctime(const time_t *timep);
功能描述:ctime( )将参数timep指向的time_t时间信息转换成实际所使用的时间日期表示方法,并以字符串形式返回。字符串格式为:"Wed Jun 20 21:00:00 2012\n"
例:
[cpp] view plaincopyprint?
  1. time_t timep;  
  2. tmep = time(NULL);  
  3. printf("%s\n", ctime(&timep));  
2.3 gmtime( )函数
头文件:#include <time.h>
函数定义:struct tm *gmtime(const time_t *timep)
功能描述:gmtime( )将参数timep指向的time_t时间信息转换成以tm结构体表示的GMT时间信息,并以struct tm*指针返回。
GMTGMT是中央时区,北京在东8,相差8个小时,所以北京时间=GMT时间+8小时
例:
[cpp] view plaincopyprint?
  1. int main(void)  
  2. {  
  3.     char *wday[] = {"Sun""Mon""Tue""Wed""Thu""Fri""Sat"};  
  4.     time_t timep;  
  5.     struct tm *p_tm;  
  6.     timep = time(NULL);  
  7.     p_tm = gmtime(&timep); /*获取GMT时间*/  
  8.     printf("%d-%d-%d ", (p_tm->tm_year+1900), (p_tm->mon+1), p_tm->tm_mday);  
  9.     printf("%s %d:%d:%d\n", wday[p_tm->tm_wday], p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);  
  10. }  
2.4 localtime( )函数
头文件:#include <time.h>
函数定义:struct tm *localtime(const time_t *timep);
功能描述:localtime( )将参数timep指向的time_t时间信息转换成以tm结构体表示的本地时区时间(如北京时间= GMT+小时)
例:
[cpp] view plaincopyprint?
  1. int main(void)  
  2. {  
  3.     char *wday[] = {"Sun""Mon""Tue""Wed""Thu""Fri""Sat"};  
  4.     time_t timep;  
  5.     struct tm *p_tm;  
  6.     timep = time(NULL);  
  7.     p_tm = localtime(&timep); /*获取本地时区时间*/  
  8.     printf("%d-%d-%d ", (p_tm->tm_year+1900), (p_tm->mon+1), p_tm->tm_mday);  
  9.     printf("%s %d:%d:%d\n", wday[p_tm->tm_wday], p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);  
  10.     return 0;  
  11. }  
2.5 mktime( )函数
头文件:#include <time.h>
函数定义:time_t mktime(struct tm *p_tm);
功能描述:mktime( )将参数p_tm指向的tm结构体数据转换成从197011000000秒至今的GMT时间经过的秒数。
例:
[cpp] view plaincopyprint?
  1. int main(void)  
  2. {  
  3.     time_t timep:  
  4.     struct tm *p_tm;  
  5.     timep = time(NULL);  
  6.     pintf("time( ):%d\n", timep);  
  7.     p_tm = local(&timep);  
  8.     timep = mktime(p_tm);  
  9.     printf("time( )->localtime( )->mktime( ):%d\n", timep);  
  10.     return 0;  
  11. }  
2.6 asctime( )函数
头文件:#include <time.h>
函数定义:char *asctime(const struct tm *p_tm);
功能描述:asctime( )将参数p_tm指向的tm结构体数据转换成实际使用的时间日期表示方法,并以字符串形式返回(ctime函数相同)。字符串格式为:"Wed Jun 20 21:00:00 2012\n"
例:
[cpp] view plaincopyprint?
  1. int main(void)  
  2. {  
  3.     time_t timep;  
  4.     timep = time(NULL);  
  5.     printf("%s\n", asctime(gmtime(&timep)));  
  6.     return 0;  
  7. }  
2.7 difftime( )函数
头文件:#include <time.h>
函数定义:double difftime(time_t timep1, time_t timep2);
功能描述:difftime( )比较参数timep1timep2时间是否相同,并返回之间相差秒数。
例:
[cpp] view plaincopyprint?
  1. int main(void)  
  2. {  
  3.     time_t timep1, timep2;  
  4.     timep1 = time(NULL);  
  5.     sleep(2);  
  6.     timep2 = time(NULL);  
  7.     printf("the difference is %f seconds\n", difftime(timep1, timep2));  
  8.     return 0;  
  9. }  
2.8 gettimeofday( )函数
头文件:#include <sys/time.h>
        #include <unistd.h>
函数定义:int gettimeofday(struct timeval *tv, struct timezone *tz);
功能描述:gettimeofday( )把目前的时间信息存入tv指向的结构体,当地时区信息则放到tz指向的结构体。
struct timezone原型:
[cpp] view plaincopyprint?
  1. struct timezone{  
  2.     int tz_minuteswest; /*miniutes west of Greenwich*/  
  3.     int tz_dsttime; /*type of DST correction*/  
  4. };  
例:
[cpp] view plaincopyprint?
  1. struct timeval tv;  
  2. struct timeval tz;  
  3. gettimeofday(&tv, &tz);  
附:
使用time函数族获取时间并输出指定格式字符串例子(strftime( )函数):
[cpp] view plaincopyprint?
  1. int main(void)  
  2. {  
  3.     char strtime[20] = {0};  
  4.     time_t timep;  
  5.     struct tm *p_tm;  
  6.     timep = time(NULL);  
  7.     p_tm = localtime(&timep);  
  8.     strftime(strtime, sizeof(strtime), "%Y-%m-%d %H:%M:%S", p_tm);  
  9.     return 0;  
  10. }  
2.9 settimeofday( )函数
头文件:#include <sys/time.h>
        #include <unistd.h>
函数定义:int settimeofday(const struct timeval *tv, const struct timezone *gz);
功能描述:settimeofday( )把当前时间设成由tv指向的结构体数据。当前地区信息则设成tz指向的结构体数据。
例:
[cpp] view plaincopyprint?
  1. int main(void)  
  2. {  
  3.     char t_string[] = "2012-04-28 22:30:00";  
  4.     struct tm time_tm;  
  5.     struct timeval time_tv;  
  6.     time_t timep;  
  7.     int ret = 0;  
  8.   
  9.     sscanf(t_string, "%d-%d-%d %d:%d:%d", &time_tm.tm_year, &time_tm.tm_mon, &time_tm.tm_mday, &time_tm.tm_hour, &time_tm.tm_min, &time_tm.tm_sec);  
  10.     time_tm.tm_year -= 1900;  
  11.     time_tm.tm_mon -= 1;  
  12.     time_tm.tm_wday = 0;  
  13.     time_tm.tm_yday = 0;  
  14.     time_tm.tm_isdst = 0;  
  15.   
  16.     timep = mktime(&time_tm);  
  17.     time_tv.tv_sec = timep;  
  18.     time_tv.tv_usec = 0;  
  19.   
  20.     ret = settimeofday(&time_tv, NULL);  
  21.     if(ret != 0)  
  22.     {  
  23.         fprintf(stderr, "settimeofday failed\n");  
  24.         return -1;  
  25.     }  
  26.     return 0;  
  27. }  
参考资料:
http://blog.csdn.net/c395565746c/article/details/6621153
http://fanqiang.chinaunix.net/a4/b8/20010527/201001267.html
http://qgjie456.blog.163.com/blog/static/35451367200844102949365/
http://hi.baidu.com/wangzhongli/blog/item/e260b3a1f388278746106461.html
http://www.eefocus.com/xuefu2009/blog/10-03/187348_f456a.html
 
转自:http://blog.csdn.net/water_cow/article/details/7521567
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信钱包密码忘了怎么办不用银行卡 企业网银密码输入三次错误怎么办 微信密码不知道手机也停用了怎么办 手机停用微信密码不记得了怎么办 农商银行登入密码忘记了怎么办 苹果手机忘记四位数解锁密码怎么办 银行卡用支付宝支付限额了怎么办 用银行卡号找回微信被盗密码怎么办 微信钱包密码错误被锁定怎么办 本人没玩财付通结果被扣了钱怎么办 我的银行卡给支付宝充不了钱怎么办 支付宝话费充错了怎么办啊 已充值成功送朋友话费不能送怎么办 微信绑定银行卡被盗刷q币怎么办 微信红包过了24小时没退回怎么办 微信6.67版本红包发错了怎么办 苹果6s还原后激活出错怎么办 q币充给了不存在的账号怎么办 怎么办微信的钱换成淘宝币 学信网密码密保手机号都忘了怎么办 第五人格玩游戏时总是闪退怎么办 qq安全中心密保手机换了怎么办 微信冻结账号绑定了银行卡怎么办 扣扣红包密码是支付密码忘了怎么办 红包退回通知不小心删除了怎么办 QQ炫舞金币充错账号怎么办 晋江的小说用晋江币买不了是怎么办 中国银行储蓄不能充值支付宝怎么办 微信怎么改银行卡密码忘记了怎么办 微信号手机号码换了密码忘了怎么办 微信被盗密码被改绑定手机号怎么办 微信qq号登陆改密码忘记了怎么办 本人微信红包赌博输了50万怎么办 4g飞享套餐话费用完了怎么办 手机丢了查话费欠了几百块怎么办 注销电信手机卡里面的余额怎么办 联通手机卡注销后里面的余额怎么办 手机卡网上销户以后剩余话费怎么办 联通新号注册微信发不了短信怎么办 韩博士装机卡在驱动恢复怎么办 xp打印后程序服务没有运行怎么办