WINDOWS下的实现

这一篇介绍Windows SDk中提供的时间函数。两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(SYSTEMTIME),CRT中的time_t时间在SDK中对应的为文件时间(FILETIME),那个"特殊时刻"也变成1601年1月1日的子夜。

当然,首先要弄清楚FILETIME与SYSTEMTIME定义。

typedef struct_FILETIME {

DWORD dwLowDateTime;

DWORD dwHighDateTime;

} FILETIME, *PFILETIME;

typedef struct_SYSTEMTIME

{

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

} SYSTEMTIME, *PSYSTEMTIME;

比较一下,很明显,FILETIME与time_t类似,是64位整型,不过FILETIME是以100纳秒(ns)为单位。SYSTEMTIME与tm类似,不过多了一项wMilliseconds。可以看出,SDK时间比CRT的时间提供了更高的精度。同时SDK提供了更丰富的函数来处理时间。

void GetSystemTime(LPSYSTEMTIME lpSystemTime);

voidGetLocalTime(LPSYSTEMTIME lpSystemTime);

这两个函数获得SYSTEMTIME形式的当前时间,不过GetSystemTime函数获得当前的UTC时间,GetLocalTime获得当前的本地时间,可以想象,获得的两个时间存在着时差。类似于CRT中提供tm与time_t之间的转换,SDK也提供了两个函数来转换SYSTEMTIME时间与FILETIME时间。

BOOL SystemTimeToFileTime(constSYSTEMTIME* lpSystemTime,LPFILETIME lpFileTime);

BOOL FileTimeToSystemTime(constFILETIME* lpFileTime,LPSYSTEMTIME lpSystemTime);

//函数命名很self-explanatory,就不用多说了吧。SDK还提供了两个很有趣的函数。

BOOL LocalFileTimeToFileTime(constFILETIME* lpLocalFileTime,LPFILETIME lpFileTime);

BOOL FileTimeToLocalFileTime(constFILETIME* lpFileTime,LPFILETIME lpLocalFileTime);

LocalFileTimeToFileTime函数将本地的FILETIME时间转换为对应的UTC的FILETIME时间。我觉得,这个函数只是通过将本地时间减去与UTC时间的时间差来实现转换,比如在东八区的本地时间转换为对应的UTC时间,只需要将本地时间减去8*60*60*1000*1000*10(单位100ns)。类似,FileTimeToLocalFileTime函数是将UTC时间转换为本地时间,它只是将减去时间差换成加上时间差。

int main()

{

SYSTEMTIME stLocal, stUTC, stUTC2;

FILETIME ftLocal, ftUTC, ft;

ULARGE_INTEGER uli;

GetLocalTime(&stLocal);

GetSystemTime(&stUTC);

printf("Local System Time(YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stLocal.wYear, stLocal.wMonth,

stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);

printf("UTC System Time (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC.wYear, stUTC.wMonth,

stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);

SystemTimeToFileTime(&stLocal, &ftLocal);

uli.LowPart = ftLocal.dwLowDateTime;

uli.HighPart = ftLocal.dwHighDateTime;

printf("Local File Time: %llu/n", uli.QuadPart);

LocalFileTimeToFileTime(&ftLocal, &ftUTC);

uli.LowPart = ftUTC.dwLowDateTime;

uli.HighPart = ftUTC.dwHighDateTime;

printf("UTC File Time: %llu/n", uli.QuadPart);

FileTimeToSystemTime(&ftUTC, &stUTC2);

printf("UTC System Time2 (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC2.wYear, stUTC2.wMonth,

stUTC2.wDay, stUTC2.wHour, stUTC2.wMinute, stUTC2.wSecond);

return EXIT_SUCCESS;

}

代码13行GetLocalTime函数获得当前的本地SYSTEMTIME时间,14行获得对应的UTC的SYSTEMTIME时间,如输出结果前两行所显示,两者相差8小时。

20行SystemTimeToFileTime函数将本地SYSTEMTIME时间转换为方便计算的本地FILETIME形式时间,如输出结果第三行所显示。

25行LocalFileTimeToFileTime函数将本地FileTime时间转换为对应的UTC的FILETIME时间,如输出结果第四行所显示。就像前面介绍的,如果你将输出结果第三,四两行所显示的数字相减,并除以10*1000*1000*60*60,你将会得出8,你可以算下试试,记住FILETIME是以100纳秒为单位的。

最后30行FileTimeToSystemTime将FILETIME时间转换为SYSTEMTIME时间。可以看出输出结果中第五行与第二行相同,这是必须的,因为两者都是当前本地时间对应的UTC时间。

LINUX下的实现

int clock_gettime(clockid_t clk_id, struct timespect *tp);

clockid_t clk_id用于指定计时时钟的类型,对于我们Programmr以下三种比较常用:

CLOCK_REALTIME, a system-wide realtime clock.

CLOCK_PROCESS_CPUTIME_ID, high-resolution timer provided by the CPU for each process.

CLOCK_THREAD_CPUTIME_ID, high-resolution timer provided by the CPU for each of the threads.

struct timespect *tp用来存储当前的时间,其结构如下:

structtimespec {

time_t tv_sec; /* seconds */

longtv_nsec; /* nanoseconds */

};

下面是示例:

#include // for printf()

#include // for gettimeofday()

#include // for sleep()

usingnamespace std;

timespec diff(timespec start, timespec end);

int main()

{

timespec time1, time2;

inttemp;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);

for(inti = 0; i < 242000000; i++)

temp += temp;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);

cout <

return 0;

}

timespec diff(timespec start, timespec end)

{

timespec temp;

if((end.tv_nsec - start.tv_nsec) < 0)

{

temp.tv_sec = end.tv_sec - start.tv_sec - 1;

temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec;

}

else

{

temp.tv_sec = end.tv_sec - start.tv_sec;

temp.tv_nsec = end.tv_nsec - start.tv_nsec;

}

return temp;

}

在LINUX中可以使用函数gettimeofday()函数来得到时间。它的精度可以达到微妙

2.函数原型:

int gettimeofday(struct timeval*tv,struct timezone *tz )

3.说明:

gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中

4.结构体:

1).

struct timeval{

long tv_sec;/*秒*/

long tv_usec;/*微妙*/

};

2).timezone 结构定义为:

struct timezone{

int tz_minuteswest;/*和greenwich 时间差了多少分钟*/

int tz_dsttime;/*type of DST correction*/

}

3).在gettimeofday()函数中tv或者tz都可以为空。如果为空则就不返回其对应的结构体。

4).函数执行成功后返回0,失败后返回-1,错误代码存于errno中。

#include // for printf()

#include // for gettimeofday()

#include // for sleep()

int delay(inttime)

{

inti, j;

for(i = 0; i < 5000; i++)

for(j = 0; j < 5000; j++)

;

}

int main()

{

structtimeval start;

structtimeval end;

unsignedlongdiff;

gettimeofday(&start, NULL);

delay(10);

gettimeofday(&end, NULL);

diff = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;

printf(“thedifference is % ld\n”, diff);

return 0;

}

Linux获取纳秒级时间,WINDOW和LINXU下获取纳秒级时间精度相关推荐

  1. 特权级转移 之 保护模式下数据段特权级保护依据

    提炼: 1 对于数据段 ,处理器进行特权级检查的时机 就是为段寄存器赋值的那一个时刻 在保护模式下 当处理器对段寄存器进行赋值的时候,处理器就会使用规则进行特权级的检查.如: mov ax, Data ...

  2. linux mysql 系统时间函数吗_linux下获取系统时间的方法

    可以用 localtime 函数分别获取年月日时分秒的数值. Linux下获得系统时间的C语言的实现方法: 1. 可以用 localtime 函数分别获取年月日时分秒的数值. #include     ...

  3. c语言windows获取时间,【转载】c/c++在windows下获取时间和计算时间差的几种方法总结...

    一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...

  4. qt获取本机全部ipv4_QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址...

    获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...

  5. android fps 获取,Android下获取FPS的几种方法

    FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来 ...

  6. linux ps le hrtime,前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度

    视频讲解 文字讲解 如果去测试代码运行的时长,你会选择哪个时间函数? 一般第一时间想到的函数是 Date.now 或 Date.getTime. 1.先讲结论 之所以这么选,是基于 精度 和 时钟同步 ...

  7. linux ns级定时器_linux用户空间获得ns纳秒级时间示例

    一.引言 我们在测试程序的性能的时候往往需要获得ns级的精确时间去衡量一个程序的性能,下面介绍下linux中用户空间获得ns级时间的方法 二.用户空间获得ns级时间 使用clock_gettime函数 ...

  8. c语言编程获取当前系统时间包含年,月,日,时,分,秒.,C语言获取系统时间的几种方式...

    核心提示:C语言中如何获取时间?精度如何?1使用time_ttime(time_t*timer)精确到秒2使用clock_tclock()得到的是CPU时间精确到1/CLOCKS_PER_SEC秒3计 ...

  9. Linux下获取毫秒级时间差

    Linux下获取毫秒级时间差 使用Linux的gettimeofday函数可以达到这个目的  其中t1=t_start.tv_sec是公元1970年至今的时间(换算为秒)  t2=t_start.tv ...

最新文章

  1. 数据库原理与设计 P75作业 学号2013211466 班级0401302
  2. PyCharm中目录directory与包package的区别
  3. VTK:Texture之TextureCutSphere
  4. java登录中用户类型分类_基于用户登陆的struts2中action的分类详解
  5. JavaScript--获取页面盒子中鼠标相对于盒子上、左边框的坐标
  6. 跨站请求伪造(CSRF/XSRF)
  7. break在matlab中的用法,求助这个算法运行的时候说错误: BREAK只能在FOR或WHile使用...
  8. minwindow java_java中setMinWindowLayout()是什么呀?
  9. 《移动App测试的22条军规》—App测试综合案例分析23.4节测试微信App的手势操作...
  10. andorid平台游戏内存修改器的开发思路
  11. oracle分布式事物锁,ORA-02049:超时:分布式事务处理等待锁诊断-Oracle
  12. linux分享二:Linux如何修改字符集
  13. C++ Primer Plus学习(十二)——类继承(is-a)
  14. yolov2 损失函数_目标检测算法之YOLOv2损失函数详解
  15. java cropper 上传_基于cropper.js的图片上传和裁剪
  16. 值得收藏的JavaScript代码
  17. 广联达报错access_广联达软件报错问题汇总和解决方案.doc
  18. 华为云HCS解决方案笔记HUAWEI CLOUD Stack【面试篇】
  19. android ota权限,Android手机Root后不能接收OTA?
  20. 继电器学习笔记(一)——继电器的分类电磁继电器和磁保持继电器的工作原理

热门文章

  1. 面试官:为啥需要枚举?枚举有什么作用?怎么用枚举实现单例?
  2. 初识爬虫,爬虫原理?爬虫是什么?为什么爬虫用python比较流行?
  3. numeric scale mysql_MySQL基础教程1 — 数据类型之数值类型 - numeric
  4. 可扩展标记语言XML(淅淅沥沥的小雨)
  5. COGS 2211. [BZOJ3653]谈笑风生
  6. HDFS开启HA后,Hbase的REGIONSERVERS启动错误(Operation category READ is not supported in state standby)
  7. 路由器修改wifi密码
  8. 从现在开始,格外珍惜时间,让生活充实起来
  9. 流体力学发展史(转)
  10. 中文分词与去除停用词