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 1244770435
443119 1244770436
443543 1244770437
444153 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 对象的指针。参考man 3 strftime获取完整的格式化代码列表。注意 localtime 和 strftime 都只处理到秒级别精度(即 struct timeval 的 tv_usec 部分是不处理的)。如果你希望这部分也被包含在你输出的字符串中,你需要手工进行处理。
要使用 strftime 或 localtime 请包含 <time.h>。
代码 8.6 所示的程序打印出了当前日期和时间,精确度到毫秒。
代码 8.6 (print-time.c) 打印日期和时间
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
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);
}