ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:21.35KB ,
资源ID:26610526      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26610526.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(linux下的时间转换函数.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

linux下的时间转换函数.docx

1、linux下的时间转换函数linux下的时间函数我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年、月、日、时、分、秒,星期等),或者是隔一段时间去做某事,那么我们就用到一些时间函数。linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构struct timeval,它精确到微妙。structtimevallongtv_sec;/*秒*/longtv_usec;/*微秒*/;而直接存储年月日的是一个结构:structtmi

2、nttm_sec;/*秒,正常范围0-59, 但允许至61*/inttm_min;/*分钟,0-59*/inttm_hour;/*小时, 0-23*/inttm_mday;/*日,即一个月中的第几天,1-31*/inttm_mon;/*月, 从一月算起,0-11*/inttm_year;/*年, 从1900至今已经多少年*/inttm_wday;/*星期,一周中的第几天, 从星期日算起,0-6*/inttm_yday;/*从今年1月1日到目前的天数,范围0-365*/inttm_isdst;/*日光节约时间的旗标*/;需要特别注意的是,年份是从1900年起至今多少年,而不是直接存储如2008年

3、,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。下面介绍一下我们常用的时间函数:#includechar*asctime(conststructtm*timeptr);将结构中的信息转换为真实世界的时间,以字符串的形式显示char*ctime(consttime_t*timep);将timep转换为真是世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样doubledifftime(time_ttime1,time_ttime2);返回两个时间相差的秒数intgettimeofday(structtimeval*tv,structtimez

4、one*tz);返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用structtm*gmtime(consttime_t*timep);将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个structtm结构指针stucttm*localtime(consttime_t*timep);和gmtime类似,但是它是经过时区转换的时间。time_tmktime(structtm*timeptr);将structtm结构的时间转换为从1970年至今的秒数time_ttime(time_t*t);取得从1970年1月1日至今的秒数。上面是简单的介绍,下面通过实战来看看这些函

5、数的用法:下载:gettime1.c1. /*gettime1.c*/2. #include3. intmain()4. 5. time_ttimep;6. time(&timep);/*获取time_t类型的当前时间*/7. /*用gmtime将time_t类型的时间转换为struct tm类型的时间按,8. 然后再用asctime转换为我们常见的格式 Fri Jan 11 17:25:24 20089. */10. printf(%s,asctime(gmtime(&timep);11. return0;12. 编译并运行:$gcc -o gettime1 gettime1.c$./get

6、time1Fri Jan 11 17:04:08 2008下面是直接把time_t类型的转换为我们常见的格式:下载:gettime2.c1. /* gettime2.c*/2. #include3. intmain()4. 5. time_ttimep;6. time(&timep);/*获取time_t类型当前时间*/7. /*转换为常见的字符串:Fri Jan 11 17:04:08 2008*/8. printf(%s,ctime(&timep);9. return0;10. 编译并运行:$gcc -o gettime2 gettime2.c$./gettime2Sat Jan 12 0

7、1:25:29 2008我看了一本书上面说的这两个例子如果先后执行的话,两个的结果除了秒上有差别之外(执行程序需要时间),应该是一样的,可是我这里执行却发现差了很长时间按,一个是周五,一个是周六,后来我用 date 命令执行了一遍$date六 1月 12 01:25:19 CST 2008我发现date和gettime2比较一致, 我估计可能gettime1并没有经过时区的转换,它们是有差别的。下载:gettime3.c1. /*gettime3.c */2. #include3. intmain()4. 5. char*wday=Sun,Mon,Tue,Wed,Thu,Fri,Sat;6.

8、time_ttimep;7. structtm*p;8. time(&timep);/*获得time_t结构的时间,UTC时间*/9. p=gmtime(&timep);/*转换为struct tm结构的UTC时间*/10. printf(%d/%d/%d,1900+p-tm_year,1+p-tm_mon,p-tm_mday);11. printf(%s %d:%d:%d/n,wdayp-tm_wday,p-tm_hour,12. p-tm_min,p-tm_sec);13. return0;14. 编译并运行:$gcc -o gettime3 gettime3.c$./gettime320

9、08/1/11 Fri 17:42:54从这个时间结果上来看,它和gettime1保持一致。下载:gettime4.c1. /*gettime4.c*/2. #include3. intmain()4. 5. char*wday=Sun,Mon,Tue,Wed,Thu,Fri,Sat;6. time_ttimep;7. structtm*p;8. time(&timep);/*获得time_t结构的时间,UTC时间*/9. p=localtime(&timep);/*转换为struct tm结构的当地时间*/10. printf(%d/%d/%d,1900+p-tm_year,1+p-tm_m

10、on,p-tm_mday);11. printf(%s %d:%d:%d/n,wdayp-tm_wday,p-tm_hour,p-tm_min,p-tm_sec);12. return0;13. 编译并运行:$gcc -o gettime4 gettime4.c$./gettime42008/1/12 Sat 1:49:29从上面的结果我们可以这样说:time, gmtime, asctime 所表示的时间都是UTC时间,只是数据类型不一样,而localtime, ctime 所表示的时间都是经过时区转换后的时间,它和你用系统命令date所表示的CST时间应该保持一致。下载:gettime5.

11、c1. /*gettime5.c*/2. #include3. intmain()4. 5. time_ttimep;6. structtm*p;7. time(&timep);/*当前time_t类型UTC时间*/8. printf(time():%d/n,timep);9. p=localtime(&timep);/*转换为本地的tm结构的时间按*/10. timep=mktime(p);/*重新转换为time_t类型的UTC时间,这里有一个时区的转换*/11. printf(time()-localtime()-mktime(): %d/n,timep);12. return0;13.

12、编译并运行:$gcc -o gettime5 gettime5.c$./gettime5time():13time()-localtime()-mktime(): 13这里面把UTC时间按转换为本地时间,然后再把本地时间转换为UTC时间,它们转换的结果保持一致。下载:gettime6.c1. /*gettime6.c */2. #include3. intmain()4. 5. time_ttimep;6. structtm*p;7. time(&timep);/*得到time_t类型的UTC时间*/8. printf(time():%d/n,timep);9. p=gmtime(&timep

13、);/*得到tm结构的UTC时间*/10. timep=mktime(p);/*转换,这里会有时区的转换*/11. printf(time()-gmtime()-mktime(): %d/n,timep);12. return0;13. 编译并运行:$gcc -o gettime6 gettime6.c$./gettime6time():92time()-gmtime()-mktime(): 92从这里面我们可以看出,转换后时间不一致了,计算一下,整整差了8个小时( (92-92)/3600 = 8 ),说明mktime会把本地时间转换为UTC时间,这里面本来就是UTC时间,于是再弄个时区转换

14、,结果差了8个小时,用的时候应该注意。函数分类:1. 设置时间: settimeofday, tzset2. 获取时间: time, ftime, gettimeofday3. 时间格式转换: mktime, strftime; gmtime, localtime; asctime, ctime4. 其他: clock, difftimeasctime: 将时间和日期以字符串格式表示头文件: time.h函数定义: char *asctime(const struct tm *timeptr);说明: asctime()将函数timeptr所指的tm结构中的信息转换成现实世界所使用的时间日期表

15、示方法, 然后将结果以字符串形态返回. 此函数已经由时区转换成当地时间, 返回的字符串格式为: Wed Jun 30 21:49:08 1993/nctime: 将时间和日期以字符串格式表示头文件: time.h函数定义: char *ctime(const time_t *timep);说明: ctime()同asctime()函数, 只是输入参数为time_t.应用举例:#include #include int main(void)time_t timep;time(&timep);printf(%s, ctime(&timep);printf(%s, asctime(gmtime(&t

16、imep);return 0;运行结果:Sun Dec 14 15:30:11 2008Sun Dec 14 15:30:11 2008clock: 取得进程占用CPU的大约时间头文件: time.h函数定义: clock_t clock(void);说明: clock()用来返回进程所占用CPU的大约时间.difftime: 计算时间差距头文件: time.h函数定义: double difftime(time_t time1, time_t time0);说明: difftime()用来计算参数time1-time0, 结果以double型精确值返回. 两个参数的时间都是以1970年1月1

17、日0时0分0秒算起的UTC时间.ftime: 取得目前的时间和日期头文件: sys/timeb.h函数定义: int ftime(struct timeb *tp);说明: ftime()将日前时间日期由参数tp所指的结构输出. tp结构定义如下:struct timeb/* 为从1970年1月1日至今的秒数 */time_t time;/* 为千分之一秒 */unsigned short millitm;/* 为目前时区和Greenwich相差的时间, 单位为单位 */short timezone;/* 为日光节约时间的修正状态, 若非0为启用日光节约时间的修正 */short dstfla

18、g;无论成功还是失败都返回0.应用举例:#include #include int main(void)struct timeb tp;ftime(&tp);printf(time: %d/n, tp.time);printf(millitm: %d/n, tp.millitm);printf(timezone: %d/n, tp.timezone);printf(dstflag: %d/n, tp.dstflag);return 0;运行结果:time: 08millitm: 716timezone: -480dstflag: 0gettimeofday: 取得目前的时间头文件: sys/t

19、ime.h unist.d函数定义: int gettimeofday(struct timeval *tv, struct timezone *tz);说明: gettimeofday()会把目前的时间用tv所指的结构返回, 当地时区的信息则放到tz所指的结构中. 成功则返回0, 失败返回1, 错误代码存于errno. EFAULT是指针tv和tz所指的内存空间超出存取权限.timeval结构定义为:struct timeval/* 为从1970年1月1日至今的秒数 */long tv_sec;/* 微秒 */long tv_usec;timezone 结构定义为:struct timezo

20、ne/* 和Greenwich时间差了多少分钟 */int tz_minuteswest;/*日光节约时间的状态*/int tz_dsttime;上述两个结构都定义在/usr/include/sys/time.h, tz_dsttime所代表的状态如下: DST_NONE /*不使用*/ DST_USA /*美国*/ DST_AUST /*澳洲*/ DST_WET /*西欧*/ DST_MET /*中欧*/ DST_EET /*东欧*/ DST_CAN /*加拿大*/ DST_GB /*大不列颠*/ DST_RUM /*罗马尼亚*/ DST_TUR /*土耳其*/ DST_AUSTALT /*

21、澳洲(1986年以后)*/gmtime: 将秒数转换目前的时间和日期头文件: time.h函数定义: struct tm *gmtime(const time_t *timep);说明: gmtime()将参数timep所指的time_t结构中的信息转换成现实世界所使用的时间日期表示方法, 然后将结果由结构tm返回. 结构tm的定义为:struct tmint tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst; int tm_sec 代表目前

22、秒数, 正常范围为0-59, 但允许至61秒 int tm_min 代表目前分数, 范围0-59 int tm_hour 从午夜算起的时数, 范围为0-23 int tm_mday 目前月份的日数, 范围01-31 int tm_mon 代表目前月份, 从一月算起, 范围从0-11 int tm_year 从1900年算起至今的年数 int tm_wday 一星期的日数, 从星期一算起, 范围为0-6 int tm_yday 从今年1月1日算起至今的天数, 范围为0-365 int tm_isdst 日光节约时间的旗标此函数返回的时间日期未经时区转换, 是UTC时间.localtime: 将秒

23、数转换当地目前的时间和日期头文件: time.h函数定义: struct *localtime(const time_t *timep);说明: localtime()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法, 然后将结果由结构tm返回. 结构tm的定义请参考gmtime(). 此函数返回的时间日期已经转换成当地时区.mktime: 将时间结构数据转换成经过的秒数头文件: time.h函数定义: time_t mktime(struct tm *timeptr);说明: mktime()用来将参数timeptr所指的tm结构数据转换成从1970年1月

24、1日0时0分0秒算起至今的UTC时间所经过的秒数. 返回经过的秒数.settimeofday: 设置目前的时间头文件: sys/time.h unistd.h函数定义: settimeofday()会把目前时间设成由tv所指的结构信息, 当地时区信息则设成tz所指的结构. 详细的说明请参考gettimeofday(). 注意, 只有root权限才能使用此函数修改时间. 成功则返回0, 失败返回1, 错误代码存于errno.错误代码: EPERM 并非由root权限调用settimeofday(), 权限不够 EINVAL 时区或某个数据是不正确的, 无法正确设置时间strftime: 格式化日

25、期和时间头文件: time.h函数定义: size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);说明: strftime()会将参数tm的时间结构, 参照参数format所指定的字符串格式做转换, 转换后的字符串内容将复制到参数s所指的字符串数组中, 该字符串的最大长度为参数max所控制. 下面是参数format的格式指令: %a 当地星期日期的名称缩写, 如: Sun %A 当地星期日期的名称缩写, 如: Sunday %b 当地月份的缩写 %B 当地月份的完整名称 %c 当地适当的日期与时

26、间表示法 %C 以year/100表示年份 %d 月里的天数, 表示法为01-31 %D 相当于%m%d%y格式 %e 月里的天数, 表示法为1-31 %h 当地月份的缩写 %H 以24小时制表示小时数, 表示法为00-23 %I 以12小时制表示小时数, 表示法为01-12 %j 一年中的天数(001-366) %k 以24小时制表示小时数, 表示法为0-23 %l 以12小时制表示小时数, 表示法为1-12 %m 月份(01-12) %M 分钟数(00-59) %n 同/n %p 显示对应的AM或PM %P 显示对应的am或pm %r 相当于使用%I:%M:%S %p格式 %R 相当于使用

27、%H:%M格式 %s 从1970年1月1日0时0分0秒算起至今的UTC时间所经过的秒数 %S 秒数(00-59) %t 同/t %T 24小时时间表示, 相当于%H:%M:%S格式 %u 一星期中的星期日期, 范围1-7, 星期一从1开始 %U 一年中的星期数(00-53), 一月第一个星期日开始为01 %w 一星期中的星期日期, 范围0-6, 星期日从0开始 %W 一年中的星期数(00-53), 一月第一个星期一开始为01 %x 当地适当的日期表示 %X 当地适当的时间表示 %y 一世纪中的年份表示 %Y 完整的公元年份表示 %Z 使用的时区名称 % %符号返回复制到参数s所指的字符串数组的

28、总字符数, 不包括字符串结束符. 如果返回0, 表示未复制字符串到参数s内, 但不表示一定有错误发生.附加说明: 环境变量TZ和TC_TIME会影响此函数结果.应用举例:#include #include int main(void)char *format = %I: %M: %S %p %m/%d %a, %x %X %Y, NULL;char buf30;int i;time_t clock;struct tm *tm;time(&clock);tm = localtime(&clock);for(i = 0; formati != NULL; i+) strftime(buf, sizeof(buf), formati, tm); printf(%s = %s/n, formati, buf);return 0;运行结果:%I: %M: %S %p %m/%d %a = 01: 46: 44 AM 12/15 Mon%x %X %Y = 12/15/08 01:46:44 2008time: 取得目前的时间头文件: time.h函数定义: time_t t

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1