方案一:

#include <time.h>
#ifdef WIN32
#   include <windows.h>
#else
#   include <sys/time.h>
#endif
#ifdef WIN32
int
gettimeofday(struct timeval *tp, void *tzp)
{
    time_t clock;
    struct tm tm;
    SYSTEMTIME wtm;
    GetLocalTime(&wtm);
    tm.tm_year     = wtm.wYear - 1900;
    tm.tm_mon     = wtm.wMonth - 1;
    tm.tm_mday     = wtm.wDay;
    tm.tm_hour     = wtm.wHour;
    tm.tm_min     = wtm.wMinute;
    tm.tm_sec     = wtm.wSecond;
    tm. tm_isdst    = -1;
    clock = mktime(&tm);
    tp->tv_sec = clock;
    tp->tv_usec = wtm.wMilliseconds * 1000;
    return (0);
}
#endif

方案二:

gettimeofday的使用

//copy from muduo
Timestamp Timestamp::now()
{struct timeval tv;gettimeofday(&tv, NULL);//返回1970年至今的秒+微秒int64_t seconds = tv.tv_sec;return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec);
}

gettimeofday要求传入一个timeval和一个时区。因为存在微秒数,显然它比 time_t now = ::time(NULL)更精确。

但是这个函数是linux下的。所以我们需要一个跨平台的实现。

以下是一个实现,使用c++的chrono库。

#include <chrono>
int gettimeofday(struct timeval *__restrict __tv, __timezone_ptr_t __tz)
{
auto now = std::chrono::system_clock::now();
auto now_ticks = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());//
__tv->tv_sec = (long)now_ticks.count() / 1000000;
__tv->tv_usec = (long)now_ticks.count() % 1000000;
return 0;
}
now.time_since_epoch()返回的duration比较奇怪,需要转化成微秒。其实主要是windows没有这个函数,那么我们实现它。
//copy from evpp
#ifdef WIN32
int gettimeofday(struct timeval* tp, void* tzp) {uint64_t  intervals;FILETIME  ft;GetSystemTimeAsFileTime(&ft);/** A file time is a 64-bit value that represents the number* of 100-nanosecond intervals that have elapsed since* January 1, 1601 12:00 A.M. UTC.** Between January 1, 1970 (Epoch) and January 1, 1601 there were* 134744 days,* 11644473600 seconds or* 11644473600,000,000,0 100-nanosecond intervals.** See also MSKB Q167296.*/intervals = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime;intervals -= 116444736000000000;tp->tv_sec = (long)(intervals / 10,000,000);tp->tv_usec = (long)((intervals % 10000000) / 10);return (0);
}

linux 下的gettimeofday 函数在windows上的替换方案相关推荐

  1. Linux下通过gettimeofday函数获取程序段执行时间

    在Linux下计算某个程序段执行的时间一般使用gettimeofday函数,此函数的声明在sys/time.h文件中.此函数接收两个结构体参数,分别为timeval.timezone.         ...

  2. sleep头文件linux,Linux下的sleep函数 要用的话得包涵什么头文件啊?

    Linux下的sleep函数 要用的话得需要#include sleep把进程的运行状态改为睡眠,将其从系统可执行队列去掉,这样系统就不会调度到该进程,不会分配CPU时间片,同时根据该进程的睡眠时间, ...

  3. linux getline参数,Linux下的getline函数

    最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...

  4. 进程间通信管道进阶篇:linux下dup/dup2函数的用法

    由于利用管道实现进程间通信,是通过创建两个文件描述符,但是描述符的初始化是通过随机的,就是从可用的文件描述符中取出,并将可用的文件描述符与file对象相关联,如果我们需要将管道的两头与其他的流相关时, ...

  5. [转帖]关于Linux下的icotl函数

    关于Linux下的icotl函数 最近接触android开发,因为有时间所以就关注了下android的源码,在跟踪源码过程中到最后都会遇到icotl函数,虽然在Symbian中曾经遇到过RSocket ...

  6. 双用户windows linux系统,Windows与Linux合二为一?终于能在windows上运行Linux了!

    原标题:Windows与Linux合二为一?终于能在windows上运行Linux了! 目前在PC端操作系统市场份额中,微软旗下的windows系统占据超过50%的比例. 作为微软旗下发布的产品之一, ...

  7. Linux下的延时函数

    Linux下的延时函数 1.sleep函数 头文件:#include<unistd.h> 功能:执行挂起操作一段时间,以秒为单位 一般形式:unsigned sleep(unsigned ...

  8. linux 多播路由查看,Linux下多播路由的实现Windows系统 -电脑资料

    前言(只是一些废话,不想看的可以略过) ===================================== 多播路由是一个很好的技术,在Internet上实现了对数据的"广播&quo ...

  9. 【samba】Wodows同步Linux文件|搭建共享文件服务器——在windows上映射网络驱动器

    目录 Linux做samba服务器 Linux上的操作 windows上的操作 windows做samba服务器 windows上的操作 linux上的操作 错误记录 Linux Samba服务主配文 ...

最新文章

  1. PoseFormer:首个纯基于Transformer的 3D 人体姿态估计网络,性能达到 SOTA
  2. AI论文引用排行榜丨微软第一,清华第九;Alphabet董事长看AI:美国仅领先5年,大陆追赶速度快;
  3. 使Git与代理服务器一起使用-因“请求超时”而失败
  4. python 安装使用saltstack salt-api 简介
  5. scikit-learn K近邻法类库使用小结
  6. 阿里云华北区挂了。。。
  7. 【USACO 2.1】The Castle
  8. UVa11882,Biggest Number
  9. 5、vsphere6-ESXI主机的安装及配置
  10. Java程序员需要注意的五大Docker误区
  11. aop日志(记录方法调用日志)
  12. python人脸识别代码实现
  13. 策略战棋游戏开发计划
  14. update与upgrade的区别
  15. 面向交付的IT软件管理流程
  16. 【已解决】macbook软件卸载了图标还在launchpad上怎么办?一分钟搞定!
  17. Element Plus 跟踪表格数据总数,包括查询、筛选等操作
  18. 虚拟机linux关机halt,linux关机命令halt
  19. 【BBED】BBED模拟并修复ORA-08102错误
  20. 土地利用/土地覆盖(LUCC)——知识汇总

热门文章

  1. 一、后台首页index.php【dedecms后台源码分析】
  2. ASP.NET 2.0与SQL Express 2005在迁移到Windows 2003时发生数据库为只读的错误
  3. Vue CLI 3.0脚手架如何在本地配置mock数据json
  4. qrcode.js 二维码生成器
  5. [TJOI2010]阅读理解
  6. Python3经典100道练习题003
  7. VS2013编译OBS源码
  8. JDK source 之 ArrayList 需要注意事项
  9. 整车厂核心制造系统及数据流
  10. acm常见算法及例题