linux下的时间转换函数.docx

上传人:b****7 文档编号:26610526 上传时间:2023-06-20 格式:DOCX 页数:14 大小:21.35KB
下载 相关 举报
linux下的时间转换函数.docx_第1页
第1页 / 共14页
linux下的时间转换函数.docx_第2页
第2页 / 共14页
linux下的时间转换函数.docx_第3页
第3页 / 共14页
linux下的时间转换函数.docx_第4页
第4页 / 共14页
linux下的时间转换函数.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

linux下的时间转换函数.docx

《linux下的时间转换函数.docx》由会员分享,可在线阅读,更多相关《linux下的时间转换函数.docx(14页珍藏版)》请在冰豆网上搜索。

linux下的时间转换函数.docx

linux下的时间转换函数

linux下的时间函数

我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年、月、日、时、分、秒,星期等),或者是隔一段时间去做某事,那么我们就用到一些时间函数。

linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。

time_t这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构structtimeval,它精确到微妙。

struct timeval

{

   long tv_sec; /*秒*/

   long tv_usec; /*微秒*/

};

而直接存储年月日的是一个结构:

struct tm

{

   int tm_sec; /*秒,正常范围0-59,但允许至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; /*从今年1月1日到目前的天数,范围0-365*/

   int tm_isdst; /*日光节约时间的旗标*/

};

需要特别注意的是,年份是从1900年起至今多少年,而不是直接存储如2008年,月份从0开始的,0表示一月,星期也是从0开始的,0表示星期日,1表示星期一。

下面介绍一下我们常用的时间函数:

#include 

char *asctime(const struct tm* timeptr);

将结构中的信息转换为真实世界的时间,以字符串的形式显示

char *ctime(const time_t *timep);

将timep转换为真是世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样

double difftime(time_t time1, time_t time2);

返回两个时间相差的秒数

int gettimeofday(struct timeval *tv, struct timezone *tz);

返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用

struct tm* gmtime(const time_t *timep);

将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针

stuct tm* localtime(const time_t *timep);

和gmtime类似,但是它是经过时区转换的时间。

time_t mktime(struct tm* timeptr);

将struct tm 结构的时间转换为从1970年至今的秒数

time_t time(time_t *t); 

取得从1970年1月1日至今的秒数。

上面是简单的介绍,下面通过实战来看看这些函数的用法:

下载:

 gettime1.c

1./*gettime1.c*/

2.#include 

3.int main()

4.{

5.time_t timep;

6.time(&timep); /*获取time_t类型的当前时间*/

7./*用gmtime将time_t类型的时间转换为structtm类型的时间按,

8.然后再用asctime转换为我们常见的格式FriJan1117:

25:

242008

9.*/

10.printf("%s", asctime(gmtime(&timep)));

11.return 0;

12.}

编译并运行:

$gcc-ogettime1gettime1.c

$./gettime1

FriJan1117:

04:

082008

下面是直接把time_t类型的转换为我们常见的格式:

下载:

 gettime2.c

1./*gettime2.c*/

2.#include 

3.int main()

4.{

5.time_t timep;

6.time(&timep); /*获取time_t类型当前时间*/

7./*转换为常见的字符串:

FriJan1117:

04:

082008*/

8.printf("%s", ctime(&timep));

9.return 0;

10.}

编译并运行:

$gcc-ogettime2gettime2.c

$./gettime2

SatJan1201:

25:

292008

我看了一本书上面说的这两个例子如果先后执行的话,两个的结果除了秒上有差别之外(执行程序需要时间),应该是一样的,可是我这里执行却发现差了很长时间按,一个是周五,一个是周六,后来我用date命令执行了一遍

$date

六1月1201:

25:

19CST2008

我发现date和gettime2比较一致,我估计可能gettime1并没有经过时区的转换,它们是有差别的。

下载:

 gettime3.c

1./*gettime3.c*/

2.#include 

3.int main()

4.{

5.char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

6.time_t timep;

7.struct tm *p;

8.time(&timep); /*获得time_t结构的时间,UTC时间*/

9.p = gmtime(&timep); /*转换为structtm结构的UTC时间*/

10.printf("%d/%d/%d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);

11.printf("%s%d:

%d:

%d/n", wday[p->tm_wday], p->tm_hour,

12.p->tm_min, p->tm_sec);

13.return 0;

14.}

编译并运行:

$gcc-ogettime3gettime3.c

$./gettime3

2008/1/11Fri17:

42:

54

从这个时间结果上来看,它和gettime1保持一致。

下载:

 gettime4.c

1./*gettime4.c*/

2.#include 

3.int main()

4.{

5.char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

6.time_t timep;

7.struct tm *p;

8.time(&timep); /*获得time_t结构的时间,UTC时间*/

9.p = localtime(&timep); /*转换为structtm结构的当地时间*/

10.printf("%d/%d/%d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);

11.printf("%s%d:

%d:

%d/n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);

12.return 0;

13.}

编译并运行:

$gcc-ogettime4gettime4.c

$./gettime4

2008/1/12Sat1:

49:

29

从上面的结果我们可以这样说:

time,gmtime,asctime所表示的时间都是UTC时间,只是数据类型不一样,而

localtime,ctime所表示的时间都是经过时区转换后的时间,它和你用系统命令date所表示的CST时间应该保持一致。

下载:

 gettime5.c

1./*gettime5.c*/

2.#include 

3.int main()

4.{

5.time_t timep;

6.struct tm *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.return 0;

13.}

编译并运行:

$gcc-ogettime5gettime5.c

$./gettime5

time():

13

time()->localtime()->mktime():

13

这里面把UTC时间按转换为本地时间,然后再把本地时间转换为UTC时间,它们转换的结果保持一致。

下载:

 gettime6.c

1./*gettime6.c*/

2.#include 

3.int main()

4.{

5.time_t timep;

6.struct tm *p;

7.time(&timep); /*得到time_t类型的UTC时间*/

8.printf("time():

%d/n",timep);

9.p = gmtime(&timep); /*得到tm结构的UTC时间*/

10.timep = mktime(p); /*转换,这里会有时区的转换*/

11.printf("time()->gmtime()->mktime():

%d/n", timep);

12.return 0;

13.}

编译并运行:

$gcc-ogettime6gettime6.c

$./gettime6

time():

92

time()->gmtime()->mktime():

92

从这里面我们可以看出,转换后时间不一致了,计算一下,整整差了8个小时((92-92)/3600=8),说明mktime会把本地时间转换为UTC时间,这里面本来就是UTC时间,于是再弄个时区转换,结果差了8个小时,用的时候应该注意。

函数分类:

1.设置时间:

settimeofday,tzset

2.获取时间:

time,ftime,gettimeofday

3.时间格式转换:

mktime,strftime;gmtime,localtime;asctime,ctime

4.其他:

clock,difftime

asctime:

将时间和日期以字符串格式表示

头文件:

time.h

函数定义:

char*asctime(conststructtm*timeptr);

说明:

asctime()将函数timeptr所指的tm结构中的信息转换成现实世界所使用的时间日期表示方法,然后将结果以字符串形态返回.此函数已经由时区转换成当地时间,返回的字符串格式为:

"WedJun3021:

49:

081993/n"

ctime:

将时间和日期以字符串格式表示

头文件:

time.h

函数定义:

char*ctime(consttime_t*timep);

说明:

ctime()同asctime()函数,只是输入参数为time_t.

应用举例:

#include

#include

intmain(void)

{

time_ttimep;

time(&timep);

printf("%s",ctime(&timep));

printf("%s",asctime(gmtime(&timep)));

return0;

}

运行结果:

SunDec1415:

30:

112008

SunDec1415:

30:

112008

clock:

取得进程占用CPU的大约时间

头文件:

time.h

函数定义:

clock_tclock(void);

说明:

clock()用来返回进程所占用CPU的大约时间.

difftime:

计算时间差距

头文件:

time.h

函数定义:

doubledifftime(time_ttime1,time_ttime0);

说明:

difftime()用来计算参数time1-time0,结果以double型精确值返回.两个参数的时间都是以1970年1月1日0时0分0秒算起的UTC时间.

ftime:

取得目前的时间和日期

头文件:

sys/timeb.h

函数定义:

intftime(structtimeb*tp);

说明:

ftime()将日前时间日期由参数tp所指的结构输出.tp结构定义如下:

structtimeb{

/*为从1970年1月1日至今的秒数*/ 

time_ttime;

/*为千分之一秒*/

unsignedshortmillitm;

/*为目前时区和Greenwich相差的时间,单位为单位*/

shorttimezone;

/*为日光节约时间的修正状态,若非0为启用日光节约时间的修正*/ 

shortdstflag; 

};

无论成功还是失败都返回0. 

应用举例:

#include

#include

intmain(void)

{

structtimebtp;

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);

return0;

}

运行结果:

time:

08

millitm:

716

timezone:

-480

dstflag:

0

gettimeofday:

取得目前的时间

头文件:

sys/time.hunist.d

函数定义:

intgettimeofday(structtimeval*tv,structtimezone*tz);

说明:

gettimeofday()会把目前的时间用tv所指的结构返回,当地时区的信息则放到tz所指的结构中.成功则返回0,失败返回-1,错误代码存于errno.EFAULT是指针tv和tz所指的内存空间超出存取权限.

timeval结构定义为:

structtimeval{

/*为从1970年1月1日至今的秒数*/

longtv_sec;

/*微秒*/ 

longtv_usec;

};

timezone结构定义为:

structtimezone{

/*和Greenwich时间差了多少分钟*/ 

inttz_minuteswest;    

/*日光节约时间的状态*/

inttz_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/*澳洲(1986年以后)*/

gmtime:

将秒数转换目前的时间和日期

头文件:

time.h

函数定义:

structtm*gmtime(consttime_t*timep);

说明:

gmtime()将参数timep所指的time_t结构中的信息转换成现实世界所使用的时间日期表示方法,然后将结果由结构tm返回.结构tm的定义为:

structtm{

inttm_sec;

inttm_min;

inttm_hour;

inttm_mday;

inttm_mon;

inttm_year;

inttm_wday;

inttm_yday;

inttm_isdst;

};

  inttm_sec  代表目前秒数,正常范围为0-59,但允许至61秒

  inttm_min  代表目前分数,范围0-59

  inttm_hour从午夜算起的时数,范围为0-23

  inttm_mday目前月份的日数,范围01-31

  inttm_mon  代表目前月份,从一月算起,范围从0-11

  inttm_year  从1900年算起至今的年数

  inttm_wday  一星期的日数,从星期一算起,范围为0-6

  inttm_yday  从今年1月1日算起至今的天数,范围为0-365

  inttm_isdst日光节约时间的旗标

此函数返回的时间日期未经时区转换,是UTC时间.

localtime:

将秒数转换当地目前的时间和日期

头文件:

time.h

函数定义:

struct*localtime(consttime_t*timep);

说明:

localtime()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回.结构tm的定义请参考gmtime().此函数返回的时间日期已经转换成当地时区.

mktime:

将时间结构数据转换成经过的秒数

头文件:

time.h

函数定义:

time_tmktime(structtm*timeptr);

说明:

mktime()用来将参数timeptr所指的tm结构数据转换成从1970年1月1日0时0分0秒算起至今的UTC时间所经过的秒数.返回经过的秒数.

settimeofday:

设置目前的时间

头文件:

sys/time.hunistd.h

函数定义:

settimeofday()会把目前时间设成由tv所指的结构信息,当地时区信息则设成tz所指的结构.详细的说明请参考gettimeofday().注意,只有root权限才能使用此函数修改时间.成功则返回0,失败返回-1,错误代码存于errno. 

错误代码:

  EPERM  并非由root权限调用settimeofday(),权限不够 

  EINVAL时区或某个数据是不正确的,无法正确设置时间

strftime:

格式化日期和时间

头文件:

time.h

函数定义:

size_tstrftime(char*s,size_tmax,constchar*format,conststructtm*tm);

说明:

strftime()会将参数tm的时间结构,参照参数format所指定的字符串格式做转换,转换后的字符串内容将复制到参数s所指的字符串数组中,该字符串的最大长度为参数max所控制.下面是参数format的格式指令:

  %a当地星期日期的名称缩写,如:

Sun

  %A当地星期日期的名称缩写,如:

Sunday

  %b当地月份的缩写

  %B当地月份的完整名称

  %c当地适当的日期与时间表示法

  %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相当于使用"%H:

%M"格式

  %s从1970年1月1日0时0分0秒算起至今的UTC时间所经过的秒数

  %S秒数(00-59)

  %t同/t

  %T24小时时间表示,相当于"%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所指的字符串数组的总字符数,不包括字符串结束符.如果返回0,表示未复制字符串到参数s内,但不表示一定有错误发生. 

附加说明:

环境变量TZ和TC_TIME会影响此函数结果.

应用举例:

#include

#include

intmain(void)

{

char*format[]={"%I:

%M:

%S%p%m/%d%a","%x%X%Y",NULL};

charbuf[30];

inti;

time_tclock;

structtm*tm;

time(&clock);

tm=localtime(&clock);

for(i=0;format[i]!

=NULL;i++)

{

  strftime(buf,sizeof(buf),format[i],tm);

  printf("%s=>%s/n",format[i],buf);

}

return0;

}

运行结果:

%I:

%M:

%S%p%m/%d%a=>01:

46:

44AM12/15Mon

%x%X%Y=>12/15/0801:

46:

442008

time:

取得目前的时间

头文件:

time.h

函数定义:

time_tt

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 水产渔业

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

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