http://www.cppblog.com/lynch/archive/2011/08/05/152520.html

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() -- 获取当前时间(保存在结构体timeval中) 
#include <stdio.h>
#include <sys/time.h>
#include <time.h>

int main(int argc, char * argv[]){

struct timeval tv; //(1)
while(1){
gettimeofday(&tv, NULL); //(2)
printf("time %u:%u\n", tv.tv_sec, tv.tv_usec);
sleep(2);
}
return 0;

}

(1) struct--timeval
--------------------------------------------------
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
millisecond 毫秒
microsecond 微秒

timeval表示一个时间点,比如:
timeval.tv_sec = 1 (s)
timevat.tv_usec = 500 000 (μs)
1:500 = 1s500000μs = 1.5s

(2) gettimeofday()
--------------------------------------------------
int gettimeofday(struct timeval *tv, struct timezone *tz);

The functions gettimeofday() and settimeofday() can get and set the time as well as a timezone. 
The use of the timezone structure is obsolete; the tz argument should normally be specified as NULL.

(3) 运行结果:
--------------------------------------------------
time 1181788367:991487
time 1181788369:991602

表示睡眠2秒经过的精确时间为: 2s115μs

 
 
http://www.6san.com/575/
 

UNIX时间:新纪元时间(Epoch Time)

UNIX时间又称POSIX时间/新纪元时间(Epoch Time):从协调世界时1970年1月1日0时0分0秒起到现在的总秒数,不包括闰秒。正值表示1970以後,负值则表示1970年以前。

Unix 2038 bug(Jason hatchet bug)

说到UNIX时间不得不提Unix 2038 bug(Jason hatchet bug):2038年1月19日3时14分07秒,32位元系统的UNIX时间将会被重置。

32位的UNIX系统会以32位二进制数字表示时间,它们最多只能表示至协调世界时间2038年1月19日3时14分07秒(二进制:01111111 11111111 11111111 11111111),在下一秒二进制数字会是10000000 00000000 00000000 00000000,这是负数,因此各系统会把时间误解作1901年12月13日20时45分52秒(亦有说回归到1970年)。这时可能会令软件发生问题,导致系统瘫痪。

目前解决方案是把系统由32位转为64位系统。在64位系统下,此时间最多可以表示到292,277,026,596年12月4日15时30分08秒。

wireshark显示时间戳/新纪元时间(Epoch Time)

依次选择菜单中的“View–>Time Display Fromat–>Seconds Since Epoch (1970-01-01): 1234567890.123456” 即可将wireshark显示的时间格式设置为时间戳、新纪元时间(Epoch Time),自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数。

转载请注明出处:6san.com 
原文地址: http://www.6san.com/575/

 

Tags: UNIX

最新文章

  1. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY
  2. php解析json数组
  3. oracle 树形SQL
  4. BZOJ3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛
  5. Java Scoket之java.io.EOFException解决方案
  6. HDU1024 Max Sum Plus Plus(DP)
  7. 嵌入式ARM开发环境搭建
  8. mysql远程授权
  9. 小程序wxss和css3的区别
  10. WebService之CXF注解之五(配置文件)
  11. SpringBoot统一异常处理
  12. js配置文件路径和项目目录文件夹位置的一致性
  13. ubuntu16.04 下使用vscode备忘录
  14. Fetch诞生记
  15. pycharm import scrapy 报错,No module named &#39;scrapy&#39;
  16. django 神奇的双下划线,通过外键的三种查询方式
  17. Unity报错 GameObject is already being activated or deactivated
  18. HDU 2571(dp)题解
  19. OC 点语法和变量作用域
  20. jqueryAjax的使用

热门文章

  1. C++基础 C++对类的管理——封装
  2. POJ:3040-Allowance(贪心好题)
  3. imageX.exe
  4. druid sqlparser使用例子
  5. 示例解读Java的跨平台原理
  6. 云计算之路-阿里云-分享:通过RDS备份文件恢复SQL Server数据库
  7. linux_shell基础-变量、数组、运算符
  8. Jmeter日期
  9. vue 自定义过度组件用法
  10. HDU 1937 F - Finding Seats 枚举