gettimeofday的实现

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); }

使用c++实现就可以。



转载于:https://www.cnblogs.com/lsaejn/p/9874218.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值