方案一:

#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. Programming C# 学习笔记(二) 出发:“Hello World”
  2. [zz] 几种类间关系:继承、实现、依赖、关联、聚合、组合及UML实现图
  3. 模为2的逆元是什么_两种求模m逆元的方法
  4. mysql数据库版本不同_MySQL不同版本数据同步
  5. NODE安装N管理出错
  6. 数据结构 【实验 串的基本操作】
  7. 如何通过C#开发一个媒体播放器(中)
  8. 基于观察者模式——创建显示天气数据
  9. Web敏感目录快速扫描软件 wwwscan
  10. Python 处理人民币金额,大小写互转
  11. 产业升级再加码 鼎捷软件助力宜兴打造智造新名片
  12. RuntimeError: CUDA error (10): invalid device ordinal
  13. 分享: Vue微信浏览器ios音乐自动播放
  14. Openerp对象字段定义详解
  15. Unity太空大战游戏-Socket网络通信教学示例
  16. deepin 作为日常办公系统
  17. wxpython wx.Destroy()和wx.Close()区别
  18. 一些Mac OS X技巧
  19. 指定JDK运行Jar包
  20. linux如何重新分区

热门文章

  1. Angular CLI ng 指令指南
  2. 【CSS】flex的常用布局
  3. python练习题-day8
  4. 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
  5. 234. Palindrome Linked List
  6. 设置图片圆角 或者圆形
  7. vue路由详解版一目了然
  8. c++ --- 字符串中的标点符号
  9. 通过阅读 Douglas Crockford 的源码学习如何写 JSON parser(一)
  10. VirtualBox虚拟机安装CentOS 7