gettimeofday: 挂钟时间
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); }