日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 下的gettimeofday 函数在windows上的替换方案

發(fā)布時(shí)間:2023/12/10 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 下的gettimeofday 函数在windows上的替换方案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

方案一:

#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要求傳入一個(gè)timeval和一個(gè)時(shí)區(qū)。因?yàn)榇嬖谖⒚霐?shù),顯然它比 time_t now = ::time(NULL)更精確。

但是這個(gè)函數(shù)是linux下的。所以我們需要一個(gè)跨平臺(tái)的實(shí)現(xiàn)。

以下是一個(gè)實(shí)現(xiàn),使用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比較奇怪,需要轉(zhuǎn)化成微秒。其實(shí)主要是windows沒有這個(gè)函數(shù),那么我們實(shí)現(xiàn)它。 //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); }

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的linux 下的gettimeofday 函数在windows上的替换方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。