timeval gettimeofday

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);
}

转载于:https://www.cnblogs.com/zhangjing0502/archive/2012/06/25/2562709.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值