LinuxUnixtime时间戳的处理转换函数
Linux/Unix time时间戳的处理转换函数
linux下的时间函数
我们在编程中可能会经常⽤到时间,⽐如取得系统的时间(获取系统的年、⽉、⽇、时、分、秒,星期等),或者是隔⼀段时间去做某事,那么我们就⽤到⼀些时间函数。
linux下存储时间常见的有两种存储⽅式:
⼀个是从1970年到现在经过了多少秒;
⼀个是⽤⼀个结构来分别存储年⽉⽇时分秒的。
time_t 这种类型就是⽤来存储从1970年到现在经过了多少秒,要想更精确⼀点,可以⽤结构struct timeval,它精确到微妙。
1struct timeval
2 {
3long tv_sec; /*秒*/
4long tv_usec; /*微秒*/
5 };
⽽直接存储年⽉⽇的是⼀个结构:
1struct tm
2 {
3int tm_sec; /*秒,正常范围0-59,但允许⾄61*/
4int tm_min; /*分钟,0-59*/
5int tm_hour; /*⼩时, 0-23*/
6int tm_mday; /*⽇,即⼀个⽉中的第⼏天,1-31*/
7int tm_mon; /*⽉,从⼀⽉算起,0-11*/
8int tm_year; /*年,从1900⾄今已经多少年*/
9int tm_wday; /*星期,⼀周中的第⼏天,从星期⽇算起,0-6*/
10int tm_yday; /*从今年1⽉1⽇到⽬前的天数,范围0-365*/
11int tm_isdst; /*⽇光节约时间的旗标*/
12 };
需要特别注意的是,年份是从1900年起⾄今多少年,⽽不是直接存储如2008年,⽉份从0开始的,0表⽰⼀⽉,星期也是从0开始的, 0表⽰星期⽇,1表⽰星期⼀。
下⾯介绍⼀下我们常⽤的时间函数:
1 #include <time.h>
2
3char *asctime(const struct tm* timeptr); //将结构中的信息转换为真实世界的时间,以字符串的形式显⽰;
4
5char *ctime(const time_t *timep); //将timep转换为真是世界的时间,以字符串显⽰,它和asctime不同就在于传⼊的参数形式不⼀样;
6
7double difftime(time_t time1, time_t time2); //返回两个时间相差的秒数;
8
9int gettimeofday(struct timeval *tv, struct timezone *tz); //返回当前距离1970年的秒数和微妙数,后⾯的tz是时区,⼀般不⽤;
10
11struct tm* gmtime(const time_t *timep); //将time_t表⽰的时间转换为没有经过时区转换的UTC时间,是⼀个struct tm结构指针;
12
13 stuct tm* localtime(const time_t *timep); //和gmtime类似,但是它是经过时区转换的时间。
14
15 time_t mktime(struct tm* timeptr); //将struct tm 结构的时间转换为从1970年⾄今的秒数;
16
17 time_t time(time_t *t); //取得从1970年1⽉1⽇⾄今的秒数。
上⾯是简单的介绍,下⾯通过实战来看看这些函数的⽤法:
下载: gettime1.c
1/*gettime1.c*/
2 #include <time.h>
3int main()
4 {
5 time_t timep;
6 time(&timep); /*获取time_t类型的当前时间*/
7/*⽤gmtime将time_t类型的时间转换为struct tm类型的时间按,
8 然后再⽤asctime转换为我们常见的格式 Fri Jan 11 17:25:24 2008
9 */
10 printf("%s", asctime(gmtime(&timep)));
11return0;
12 }
编译并运⾏:
$gcc -o gettime1 gettime1.c
$./gettime1
Fri Jan 1117:04:082008
下⾯是直接把time_t类型的转换为我们常见的格式:
下载: gettime2.c
13/* gettime2.c*/
14 #include <time.h>
15int main()
16 {
17 time_t timep;
18 time(&timep); /*获取time_t类型当前时间*/
19/*转换为常见的字符串:Fri Jan 11 17:04:08 2008*/
20 printf("%s", ctime(&timep));
21return0;
22 }
编译并运⾏:
$gcc -o gettime2 gettime2.c
$./gettime2
Sat Jan 1201:25:292008
我看了⼀本书上⾯说的这两个例⼦如果先后执⾏的话,两个的结果除了秒上有差别之外(执⾏程序需要时间),应该是⼀样的,可是我这⾥执⾏却发现差了很长时间按,⼀个是周五,⼀个是周六,后来我⽤ date 命令执⾏了⼀遍
$date
六 1⽉ 12 01:25:19 CST 2008
我发现date和gettime2⽐较⼀致,我估计可能gettime1并没有经过时区的转换,它们是有差别的。
下载: gettime3.c
23/*gettime3.c */
24 #include <time.h>
25int main()
26 {
27char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
28 time_t timep;
29struct tm *p;
30 time(&timep); /*获得time_t结构的时间,UTC时间*/
31 p = gmtime(&timep); /*转换为struct tm结构的UTC时间*/
32 printf("%d/%d/%d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
33 printf("%s %d:%d:%d/n", wday[p->tm_wday], p->tm_hour,
34 p->tm_min, p->tm_sec);
35return0;
36 }
编译并运⾏:
$gcc -o gettime3 gettime3.c
$./gettime3
2008/1/11 Fri 17:42:54
从这个时间结果上来看,它和gettime1保持⼀致。
下载: gettime4.c
37/*gettime4.c*/
38 #include <time.h>
39int main()
40 {
41char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
42 time_t timep;
43struct tm *p;
44 time(&timep); /*获得time_t结构的时间,UTC时间*/
45 p = localtime(&timep); /*转换为struct tm结构的当地时间*/
46 printf("%d/%d/%d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
47 printf("%s %d:%d:%d/n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
48return0;
49 }
编译并运⾏:
$gcc -o gettime4 gettime4.c
$./gettime4
2008/1/12 Sat 1:49:29
从上⾯的结果我们可以这样说:
time, gmtime, asctime 所表⽰的时间都是UTC时间,只是数据类型不⼀样,⽽unix时间戳转换日期格式
localtime, ctime 所表⽰的时间都是经过时区转换后的时间,它和你⽤系统命令date所表⽰的CST时间应该保持⼀致。
下载: gettime5.c
50/*gettime5.c*/
51 #include <time.h>
52int main()
53 {
54 time_t timep;
55struct tm *p;
56 time(&timep); /*当前time_t类型UTC时间*/
57 printf("time():%d/n",timep);
58 p = localtime(&timep); /*转换为本地的tm结构的时间按*/
59 timep = mktime(p); /*重新转换为time_t类型的UTC时间,这⾥有⼀个时区的转换*/
60 printf("time()->localtime()->mktime(): %d/n", timep);
61return0;
62 }
编译并运⾏:
$gcc -o gettime5 gettime5.c
$./gettime5
time():1200074913
time()->localtime()->mktime(): 1200074913
这⾥⾯把UTC时间按转换为本地时间,然后再把本地时间转换为UTC时间,它们转换的结果保持⼀致。
下载: gettime6.c
63/*gettime6.c */
64 #include <time.h>
65int main()
66 {
67 time_t timep;
68struct tm *p;
69 time(&timep); /*得到time_t类型的UTC时间*/
70 printf("time():%d/n",timep);
71 p = gmtime(&timep); /*得到tm结构的UTC时间*/
72 timep = mktime(p); /*转换,这⾥会有时区的转换*/
73 printf("time()->gmtime()->mktime(): %d/n", timep);
74return0;
75 }
编译并运⾏:
$gcc -o gettime6 gettime6.c
$./gettime6
time():1200075192
time()->gmtime()->mktime(): 1200046392
从这⾥⾯我们可以看出,转换后时间不⼀致了,计算⼀下,整整差了8个⼩时( (1200075192-1200046392)/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(const struct tm *timeptr);
说明: asctime()将函数timeptr所指的tm结构中的信息转换成现实世界所使⽤的时间⽇期表⽰⽅法, 然后将结果以字符串形态返回. 此函数已经由时区转换成当地时间, 返回的字符串格式为: "Wed Jun 30 21:49:08 1993/n"
ctime: 将时间和⽇期以字符串格式表⽰
头⽂件: time.h
函数定义: char *ctime(const time_t *timep);
说明: ctime()同asctime()函数, 只是输⼊参数为time_t.
应⽤举例:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t timep;
time(&timep);
printf("%s", ctime(&timep));
printf("%s", asctime(gmtime(&timep)));
return0;
}
运⾏结果:
Sun Dec 1415:30:112008
Sun Dec 1415:30:112008
clock: 取得进程占⽤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⽇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 dstflag;
};
⽆论成功还是失败都返回0.
应⽤举例:
#include <stdio.h>
#include <sys/timeb.h>
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);
return0;
}
运⾏结果:
time: 1229271908
millitm: 716
timezone: -480
dstflag: 0
gettimeofday: 取得⽬前的时间
头⽂件: sys/time.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 timezone{
/* 和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 /*澳洲(1986年以后)*/
gmtime: 将秒数转换⽬前的时间和⽇期
头⽂件: time.h
函数定义: struct tm *gmtime(const time_t *timep);
说明: gmtime()将参数timep所指的time_t结构中的信息转换成现实世界所使⽤的时间⽇期表⽰⽅法, 然后将结果由结构tm返回.
结构tm的定义为:
struct tm{
int 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 代表⽬前秒数, 正常范围为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: 将秒数转换当地⽬前的时间和⽇期

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。