时间函数概览

一直对时间的操作函数没有一个整体的感觉,总想对时间函数进行学习,了解一下有哪些
API,以及大致的使用方法。主要是使用time.h中的函数。

函数原型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <time.h>
struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};

time_t time ( time_t *tloc );
time_t mktime ( struct tm *tm );
struct tm *gmtime (const time_t *timep);
struct tm *localtime(const time_t *timep);
char *ctime (const time_t *timep);
char *asctime (const struct tm *tm );

size_t strftime (char *s, size_t max, const char *format, const struct tm *tm);
double difftime (time_t time1, time_t time0);
clock_t clock (void);

函数说明

这些函数中只有time()一个函数可以获取当前时间,所以这个函数非常重要,要根据当前
时间进行操作的话,必须先由这个函数获得时间。time()的返回值同样会存放在传入的参
数中,可以由任意方式获得。

然后是类型time_tstruct tm的相互转换,由函数mktime()gmtime()
localtime()来完成。其中gmtime()localtime()的不同在于localtime()的返回
值是根据时区调整过的。

最后是将时间转换成人类可读的字符串,由函数ctime()asctime()完成。这两个函数
的不同就在于参数类型不同,且ctime(t) == asctime(localtime(t))

格式化输出时间的函数strftime(),详细参数请查看手册,下面的例子程序中有一些简单
的示例。

时间差函数difftime()用来计算两个时间的差值,注意参数的顺序,结果由一个
double类型表示经过的秒数。

函数clock()可以大致计算程序运行时间。具体请看示例程序。

示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <time.h>

#define BUFSIZE 1024

int main(int argc, char *argv[])
{
struct tm *ptmds;
struct tm *pgmtime, *plocaltime;
time_t ttmp, tcur;
time_t tlocaltime, tgmtime;
double seconds;
char buf[BUFSIZE];
clock_t clk;

clk = clock();

tcur = time(&ttmp);

printf("ret: %ld, arg: %ld\n", tcur, ttmp);
printf("ctime (&time_t) : %s\n", ctime(&tcur));

pgmtime = gmtime(&tcur);
printf("asctime(pgmtime()) : %s", asctime(pgmtime));

tgmtime = mktime(pgmtime);
printf("mktime (gmtime) : %ld\n", tgmtime);

plocaltime = localtime(&tcur);
printf("asctime(plocaltime()): %s", asctime(plocaltime));

tlocaltime = mktime(plocaltime);
printf("mktime (localtime) : %ld\n", tlocaltime);

seconds = difftime(tlocaltime, tgmtime);
printf("\ndiff between localtime and gmtime: %.f, %.f, %.f\n", seconds, seconds/60, seconds/3600);
seconds = difftime(tgmtime, tlocaltime);
printf("diff between localtime and gmtime: %.f, %.f, %.f\n\n", seconds, seconds/60, seconds/3600);

printf("plocaltime->tm_sec: %d\n", plocaltime->tm_sec);
printf("plocaltime->tm_min: %d\n", plocaltime->tm_min);
printf("plocaltime->tm_hour: %d\n", plocaltime->tm_hour);
printf("plocaltime->tm_mday: %d\n", plocaltime->tm_mday);
printf("plocaltime->tm_mon: %d\n", plocaltime->tm_mon);
printf("plocaltime->tm_year: %d\n", plocaltime->tm_year);
printf("plocaltime->tm_wday: %d\n", plocaltime->tm_wday);
printf("plocaltime->tm_yday: %d\n", plocaltime->tm_yday);
printf("plocaltime->tm_isdst: %d\n", plocaltime->tm_isdst);

if (strftime(buf, BUFSIZE, "%A %B %c %D", plocaltime) == 0) {
printf("\nstrftime returned 0\n");
} else {
printf("%s\n", buf);
}

clk = clock() - clk;
printf("\nProgram run about %f seconds\n", ((double)clk)/CLOCKS_PER_SEC);

return 0;
}

References

ctime (time.h)

0%