struct timeval结构体在time.h中的定义为:
struct timeval{ time_t tv_sec; /* Seconds. */ 秒 suseconds_t tv_usec; /* Microseconds. */ 微秒};其中,tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒struct timeval结构体在time.h中的定义为:
struct timeval{ time_t tv_sec; /* Seconds. */ suseconds_t tv_usec; /* Microseconds. */};其中,tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头。比如当前我写博文时的tv_sec为1244770435,tv_usec为442388,即当前时间距Epoch时间1244770435秒,442388微秒。需要注意的是,因为循环过程,新建结构体变量等过程需消耗部分时间,我们作下面的运算时会得到如下结果:int i;for (i = 0; i < 4; ++i){ gettimeofday(&tv, NULL);printf("%d\t%d\n", tv.tv_usec, tv.tv_sec);sleep(1);}442388 1244770435443119 1244770436443543 1244770437444153 1244770438前面为微秒数,后面为秒数,可以看出,在这个简单运算中,只能精确到小数点后面一到两位,或者可以看出,每进行一次循环,均需花费0.005秒的时间,用这个程序来作计时器显然是不行的,除非精确计算产生的代码消耗时间。
另:
gettimeofday 系统调用可以获取系统当前挂钟时间(Wall-Clock Time)。它的第一个参数是一个指向 struct timeval 类型空间的指针。这个结构可以表示一个以秒为单位的时间。这个值被分为两个域,tv_sec 表示整秒数,而 tv_usec 表示剩余的微秒部分。整个 struct timeval 值表示的是从 Unix ''epoch''(UTC 时间 1970 年 1 月 1 日)开始到当前流逝的时间。gettimeofday 的第二个参数应该为 NULL。如需调用,请包含 <sys/time.h>。
以 Unix epoch 计算的秒数并不是一种非常便捷的计算时间的方式。库函数 localtime 和 strftime 被提供以帮助解析 gettimeofday 函数的返回值。localtime 函数的参数是一个指向秒数(struct timeval 中的 tv_sec 域)的指针,返回值是指向一个 struct tm 类型空间的指针。这个结构中包含的信息更有意义,它们是根据当前时区设置而被填入的时间域:
- tm_hour、tm_min、tm_sec
- 当天的时间,分别对应时、分、秒 tm_year、tm_mon、tm_day
- 年、月、日 tm_wday
- 星期几。0 代表星期天。 tm_yday
- 一年中的第几天。 tm_isdst
- 代表启用夏令时的标志位。
而 strftime 可以从这个 struct tm 指针进一步生成自定义格式化的表示时间的字符串。格式与 printf 的指定方式类似,通过内嵌特定的代码指示输出特定的时间域。如下列字符串
%Y-%m-%d %H:%M:%S
将以如下格式输出时间:
2001-01-14 13:09:42
strftime 接受的参数依次包括一个指向字符缓冲的指针、缓冲的长度、格式化字符串和一个指向 struct tm 对象的指针。参考获取完整的格式化代码列表。注意 localtime 和 strftime 都只处理到秒级别精度(即 struct timeval 的 tv_usec 部分是不处理的)。如果你希望这部分也被包含在你输出的字符串中,你需要手工进行处理。
要使用 strftime 或 localtime 请包含 <time.h>。
代码 8.6 所示的程序打印出了当前日期和时间,精确度到毫秒。
代码 8.6 (print-time.c) 打印日期和时间
#include#include #include #include void print_time () { struct timeval tv; struct tm* ptm; char time_string[40]; long milliseconds; /* 获得日期时间,并转化为 struct tm。 */ gettimeofday (&tv, NULL); ptm = localtime (&tv.tv_sec); /* 格式化日期和时间,精确到秒为单位。*/ strftime (time_string, sizeof (time_string), “%Y-%m-%d %H:%M:%S”, ptm); /* 从微秒计算毫秒。*/ milliseconds = tv.tv_usec / 1000; /* 以秒为单位打印格式化后的时间日期,小数点后为毫秒。*/ printf (“%s.%03ld\n”, time_string, milliseconds); }