linux下使用gettimeofday获取当前时间的注意事项

有时候需要打印代码执行到某处的时间,或者需要计算程序执行的时间差。这时会用到gettimeofday函数,它可以返回自1970-01-01 00:00:00到现在所经历的秒数(这里是Coordinated Universal Time (UTC),以前也叫Greenwich Mean Time (GMT),该函数的第二个参数应该为NULL),

该函数定义在<sys/time.h>中,

int gettimeofday(struct timeval *, struct timezone *);

使用到两个结构体,

struct timeval {
 time_t tv_sec;
 suseconds_t tv_usec;
};

struct timezone {
 int tz_minuteswest;
 int tz_dsttime;
};

这里需要注意的是timeval中的tv_sec是time_t类型的,即long的类型。在32位下为4个字节,能够表示的最大正整数是2147483647,而这个表示的时间最大能到2038-01-19 03:14:07,超过了之后就变为-2147483648,这就是linux2038年的问题。而64位系统下的time_t类型即long类型长度为8个字节,可以用到几千亿年,这么长的时间完全不用担心溢出的问题。

我们很可能会用到精确到毫秒的时间,这样可以这样写,

struct timeval tv;
gettimeofday(&tv, NULL);
int64_t ts = (int64_t)tv.tv_sec*1000 + tv.tv_usec/1000;

注意了其中的(int64_t)类型转换对于32位的系统是必须的,否则乘上1000会溢出。有些人可能没有注意到这个问题,因为溢出后计算出来的值也是随时间递增的,而且计算一段时间差也是对的。但严谨的工程师都应该注意到因字长不足导致的溢出错误。

参考文献:

1. 聊聊Linux2038年问题 http://blog.csdn.net/linyt/article/details/52728910

2. gettimeofday取毫秒的溢出问题 http://wuzhiwei.net/one_overflow_issue/

 

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值