linux下的时间转换函数.docx
- 文档编号:26610526
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:14
- 大小:21.35KB
linux下的时间转换函数.docx
《linux下的时间转换函数.docx》由会员分享,可在线阅读,更多相关《linux下的时间转换函数.docx(14页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 时间 转换 函数